install required packages (only need to do this once?)
install.packages(“ggplot2”); # for graphics functions install.packages(“car”); # for the leveneTest() function install.packages(“pastecs”); # for the stat.desc() function install.packages(“psych”); # for the describe() function install.packages(“hrbrthemes”) install.packages(“viridis”)
“call” the required packages (need to do this every session?)
library(car); library(ggplot2); library(pastecs); library(psych); library(hrbrthemes); library(viridis)
Loading required package: carData
Registered S3 method overwritten by 'data.table':
method from
print.data.table
Attaching package: ‘psych’
The following objects are masked from ‘package:ggplot2’:
%+%, alpha
The following object is masked from ‘package:car’:
logit
Registered S3 methods overwritten by 'htmltools':
method from
print.html tools:rstudio
print.shiny.tag tools:rstudio
print.shiny.tag.list tools:rstudio
NOTE: Either Arial Narrow or Roboto Condensed fonts are required to use these themes.
Please use hrbrthemes::import_roboto_condensed() to install Roboto Condensed and
if Arial Narrow is not on your system, please see https://bit.ly/arialnarrow
Loading required package: viridisLite
Use Excel to generate a .csv file with “tidy” data (each row = 1 case / subject, 1st row is column names). Import .CSV file into R “dataframe” called “watermazedata”. Then show the “watermazedata” dataframe (header + 1st 8 data rows) to check it out
watermazedata <- read.csv(file="./data_clean/water maze all.csv", header=TRUE, sep=",")
watermazedata
Derive new variables. Mostly use the rowMeans() function, but these may be useful as well…
Make some new DVs (~“columns”) assigned 1 (TRUE) or 0 (FALSE) based on Boolean calculations: - Less than? watermazedata\(Duration.Spatial2LessThanSpatial1 <- watermazedata\)Duration.Spatial2 < watermazedata\(Duration.Spatial2 - Less than or equal to? watermazedata\)Duration.Spatial1LessThanOrEqualTo60 <- watermazedata\(Duration.Spatial2 <= 60 - Equal to? watermazedata\)Sh <- watermazedata\(Treatment == "Sh" - Not equal to? watermazedata\)NotSh <- watermazedata$Treatment != “Sh”
Use “ifelse” to maybe replace scores (e.g., replace any duration greater than 60 with NA “missing data”, else keep the same) - watermazedata\(Duration.Spatial.Clean <- ifelse(watermazedata\)Duration.Spatial > 60, NA, watermazedata$Duration.Spatial)
# Trials 1-10 for cued, spatial 1, spatial 2 and spatial trials averaged into 5 blocks (2 trials each) each for both Distance and Duration
watermazedata$Duration.Cued.Block1 <- rowMeans(cbind
(watermazedata$Duration.Cued.1,
watermazedata$Duration.Cued.2),
na.rm = TRUE)
watermazedata$Duration.Cued.Block2 <- rowMeans(cbind
(watermazedata$Duration.Cued.3,
watermazedata$Duration.Cued.4),
na.rm = TRUE)
watermazedata$Duration.Cued.Block3 <- rowMeans(cbind
(watermazedata$Duration.Cued.5,
watermazedata$Duration.Cued.6),
na.rm = TRUE)
watermazedata$Duration.Cued.Block4 <- rowMeans(cbind
(watermazedata$Duration.Cued.7,
watermazedata$Duration.Cued.8),
na.rm = TRUE)
watermazedata$Duration.Cued.Block5 <- rowMeans(cbind
(watermazedata$Duration.Cued.9,
watermazedata$Duration.Cued.10),
na.rm = TRUE)
watermazedata$Duration.Spatial1.Block1 <- rowMeans(cbind
(watermazedata$Duration.Spatial1.1,
watermazedata$Duration.Spatial1.2),
na.rm = TRUE)
watermazedata$Duration.Spatial1.Block2 <- rowMeans(cbind
(watermazedata$Duration.Spatial1.3,
watermazedata$Duration.Spatial1.4),
na.rm = TRUE)
watermazedata$Duration.Spatial1.Block3 <- rowMeans(cbind
(watermazedata$Duration.Spatial1.5,
watermazedata$Duration.Spatial1.6),
na.rm = TRUE)
watermazedata$Duration.Spatial1.Block4 <- rowMeans(cbind
(watermazedata$Duration.Spatial1.7,
watermazedata$Duration.Spatial1.8),
na.rm = TRUE)
watermazedata$Duration.Spatial1.Block5 <- rowMeans(cbind
(watermazedata$Duration.Spatial1.9,
watermazedata$Duration.Spatial1.10),
na.rm = TRUE)
watermazedata$Duration.Spatial2.Block1 <- rowMeans(cbind
(watermazedata$Duration.Spatial2.1,
watermazedata$Duration.Spatial2.2),
na.rm = TRUE)
watermazedata$Duration.Spatial2.Block2 <- rowMeans(cbind
(watermazedata$Duration.Spatial2.3,
watermazedata$Duration.Spatial2.4),
na.rm = TRUE)
watermazedata$Duration.Spatial2.Block3 <- rowMeans(cbind
(watermazedata$Duration.Spatial2.5,
watermazedata$Duration.Spatial2.6),
na.rm = TRUE)
watermazedata$Duration.Spatial2.Block4 <- rowMeans(cbind
(watermazedata$Duration.Spatial2.7,
watermazedata$Duration.Spatial2.8),
na.rm = TRUE)
watermazedata$Duration.Spatial2.Block5 <- rowMeans(cbind
(watermazedata$Duration.Spatial2.9,
watermazedata$Duration.Spatial2.10),
na.rm = TRUE)
watermazedata$Duration.Spatial3.Block1 <- rowMeans(cbind
(watermazedata$Duration.Spatial3.1,
watermazedata$Duration.Spatial3.2),
na.rm = TRUE)
watermazedata$Duration.Spatial3.Block2 <- rowMeans(cbind
(watermazedata$Duration.Spatial3.3,
watermazedata$Duration.Spatial3.4),
na.rm = TRUE)
watermazedata$Duration.Spatial3.Block3 <- rowMeans(cbind
(watermazedata$Duration.Spatial3.5,
watermazedata$Duration.Spatial3.6),
na.rm = TRUE)
watermazedata$Duration.Spatial3.Block4 <- rowMeans(cbind
(watermazedata$Duration.Spatial3.7,
watermazedata$Duration.Spatial3.8),
na.rm = TRUE)
watermazedata$Duration.Spatial3.Block5 <- rowMeans(cbind
(watermazedata$Duration.Spatial3.9,
watermazedata$Duration.Spatial3.10),
na.rm = TRUE)
watermazedata$Distance.Cued.Block1 <- rowMeans(cbind
(watermazedata$Distance.Cued.1,
watermazedata$Distance.Cued.2),
na.rm = TRUE)
watermazedata$Distance.Cued.Block2 <- rowMeans(cbind
(watermazedata$Distance.Cued.3,
watermazedata$Distance.Cued.4),
na.rm = TRUE)
watermazedata$Distance.Cued.Block3 <- rowMeans(cbind
(watermazedata$Distance.Cued.5,
watermazedata$Distance.Cued.6),
na.rm = TRUE)
watermazedata$Distance.Cued.Block4 <- rowMeans(cbind
(watermazedata$Distance.Cued.7,
watermazedata$Distance.Cued.8),
na.rm = TRUE)
watermazedata$Distance.Cued.Block5 <- rowMeans(cbind
(watermazedata$Distance.Cued.9,
watermazedata$Distance.Cued.10),
na.rm = TRUE)
watermazedata$Distance.Spatial1.Block1 <- rowMeans(cbind
(watermazedata$Distance.Spatial1.1,
watermazedata$Distance.Spatial1.2),
na.rm = TRUE)
watermazedata$Distance.Spatial1.Block2 <- rowMeans(cbind
(watermazedata$Distance.Spatial1.3,
watermazedata$Distance.Spatial1.4),
na.rm = TRUE)
watermazedata$Distance.Spatial1.Block3 <- rowMeans(cbind
(watermazedata$Distance.Spatial1.5,
watermazedata$Distance.Spatial1.6),
na.rm = TRUE)
watermazedata$Distance.Spatial1.Block4 <- rowMeans(cbind
(watermazedata$Distance.Spatial1.7,
watermazedata$Distance.Spatial1.8),
na.rm = TRUE)
watermazedata$Distance.Spatial1.Block5 <- rowMeans(cbind
(watermazedata$Distance.Spatial1.9,
watermazedata$Distance.Spatial1.10),
na.rm = TRUE)
watermazedata$Distance.Spatial2.Block1 <- rowMeans(cbind
(watermazedata$Distance.Spatial2.1,
watermazedata$Distance.Spatial2.2),
na.rm = TRUE)
watermazedata$Distance.Spatial2.Block2 <- rowMeans(cbind
(watermazedata$Distance.Spatial2.3,
watermazedata$Distance.Spatial2.4),
na.rm = TRUE)
watermazedata$Distance.Spatial2.Block3 <- rowMeans(cbind
(watermazedata$Distance.Spatial2.5,
watermazedata$Distance.Spatial2.6),
na.rm = TRUE)
watermazedata$Distance.Spatial2.Block4 <- rowMeans(cbind
(watermazedata$Distance.Spatial2.7,
watermazedata$Distance.Spatial2.8),
na.rm = TRUE)
watermazedata$Distance.Spatial2.Block5 <- rowMeans(cbind
(watermazedata$Distance.Spatial2.9,
watermazedata$Distance.Spatial2.10),
na.rm = TRUE)
watermazedata$Distance.Spatial3.Block1 <- rowMeans(cbind
(watermazedata$Distance.Spatial3.1,
watermazedata$Distance.Spatial3.2),
na.rm = TRUE)
watermazedata$Distance.Spatial3.Block2 <- rowMeans(cbind
(watermazedata$Distance.Spatial3.3,
watermazedata$Distance.Spatial3.4),
na.rm = TRUE)
watermazedata$Distance.Spatial3.Block3 <- rowMeans(cbind
(watermazedata$Distance.Spatial3.5,
watermazedata$Distance.Spatial3.6),
na.rm = TRUE)
watermazedata$Distance.Spatial3.Block4 <- rowMeans(cbind
(watermazedata$Distance.Spatial3.7,
watermazedata$Distance.Spatial3.8),
na.rm = TRUE)
watermazedata$Distance.Spatial3.Block5 <- rowMeans(cbind
(watermazedata$Distance.Spatial3.9,
watermazedata$Distance.Spatial3.10),
na.rm = TRUE)
# Cued, spatial 1, spatial 2 and spatial blocks 1-5 averaged into Overall Averages for both Distance and Duration
watermazedata$Duration.Cued <- rowMeans(cbind (watermazedata$Duration.Cued.1,
watermazedata$Duration.Cued.2,
watermazedata$Duration.Cued.3,
watermazedata$Duration.Cued.4,
watermazedata$Duration.Cued.5),
na.rm = TRUE)
watermazedata$Duration.Spatial1 <- rowMeans(cbind (watermazedata$Duration.Spatial1.1,
watermazedata$Duration.Spatial1.2,
watermazedata$Duration.Spatial1.3,
watermazedata$Duration.Spatial1.4,
watermazedata$Duration.Spatial1.5),
na.rm = TRUE)
watermazedata$Duration.Spatial2 <- rowMeans(cbind (watermazedata$Duration.Spatial2.1,
watermazedata$Duration.Spatial2.2,
watermazedata$Duration.Spatial2.3,
watermazedata$Duration.Spatial2.4,
watermazedata$Duration.Spatial2.5),
na.rm = TRUE)
watermazedata$Duration.Spatial3 <- rowMeans(cbind (watermazedata$Duration.Spatial3.1,
watermazedata$Duration.Spatial3.2,
watermazedata$Duration.Spatial3.3,
watermazedata$Duration.Spatial3.4,
watermazedata$Duration.Spatial3.5),
na.rm = TRUE)
watermazedata$Duration.Spatial <- rowMeans(cbind (watermazedata$Duration.Spatial1,
watermazedata$Duration.Spatial2,
watermazedata$Duration.Spatial3),
na.rm = TRUE)
watermazedata$Distance.Cued <- rowMeans(cbind (watermazedata$Distance.Cued.1,
watermazedata$Distance.Cued.2,
watermazedata$Distance.Cued.3,
watermazedata$Distance.Cued.4,
watermazedata$Distance.Cued.5),
na.rm = TRUE)
watermazedata$Distance.Spatial1 <- rowMeans(cbind (watermazedata$Distance.Spatial1.1,
watermazedata$Distance.Spatial1.2,
watermazedata$Distance.Spatial1.3,
watermazedata$Distance.Spatial1.4,
watermazedata$Distance.Spatial1.5),
na.rm = TRUE)
watermazedata$Distance.Spatial2 <- rowMeans(cbind (watermazedata$Distance.Spatial2.1,
watermazedata$Distance.Spatial2.2,
watermazedata$Distance.Spatial2.3,
watermazedata$Distance.Spatial2.4,
watermazedata$Distance.Spatial2.5),
na.rm = TRUE)
watermazedata$Distance.Spatial3 <- rowMeans(cbind (watermazedata$Distance.Spatial3.1,
watermazedata$Distance.Spatial3.2,
watermazedata$Distance.Spatial3.3,
watermazedata$Distance.Spatial3.4,
watermazedata$Distance.Spatial3.5),
na.rm = TRUE)
watermazedata$Distance.Spatial <- rowMeans(cbind (watermazedata$Distance.Spatial1,
watermazedata$Distance.Spatial2,
watermazedata$Distance.Spatial3),
na.rm = TRUE)
# Make a Speed variable (Distance/Duration)
watermazedata$Speed <- watermazedata$Distance.Spatial / watermazedata$Duration.Spatial
# Make working memory variables
watermazedata$Working.Duration.Trial1.1 <- watermazedata$Duration.Spatial1.1
watermazedata$Working.Duration.Trial2.1 <- watermazedata$Duration.Spatial1.2
watermazedata$Working.Duration.Diff.1 <- watermazedata$Duration.Spatial1.1 - watermazedata$Duration.Spatial1.2
watermazedata$Working.Duration.Trial1.2 <- watermazedata$Duration.Spatial2.1
watermazedata$Working.Duration.Trial2.2 <- watermazedata$Duration.Spatial2.2
watermazedata$Working.Duration.Diff.2 <- watermazedata$Duration.Spatial2.1 - watermazedata$Duration.Spatial2.2
watermazedata$Working.Duration.Trial1.3 <- watermazedata$Duration.Spatial3.1
watermazedata$Working.Duration.Trial2.3 <- watermazedata$Duration.Spatial3.2
watermazedata$Working.Duration.Diff.3 <- watermazedata$Duration.Spatial3.1 - watermazedata$Duration.Spatial3.2
watermazedata$Working.Duration.Trial1.Ave <- (watermazedata$Duration.Spatial1.1 + watermazedata$Duration.Spatial2.1 + watermazedata$Duration.Spatial3.1) / 3
watermazedata$Working.Duration.Trial2.Ave <- (watermazedata$Duration.Spatial1.2 + watermazedata$Duration.Spatial2.2 + watermazedata$Duration.Spatial3.2) / 3
watermazedata$Working.Duration.Diff.Ave <- (watermazedata$Working.Duration.Diff.1 + watermazedata$Working.Duration.Diff.2 + watermazedata$Working.Duration.Diff.3) / 3
watermazedata$Working.Distance.Trial1.1 <- watermazedata$Distance.Spatial1.1
watermazedata$Working.Distance.Trial2.1 <- watermazedata$Distance.Spatial1.2
watermazedata$Working.Distance.Diff.1 <- watermazedata$Distance.Spatial1.1 - watermazedata$Distance.Spatial1.2
watermazedata$Working.Distance.Trial1.2 <- watermazedata$Distance.Spatial2.1
watermazedata$Working.Distance.Trial2.2 <- watermazedata$Distance.Spatial2.2
watermazedata$Working.Distance.Diff.2 <- watermazedata$Distance.Spatial2.1 - watermazedata$Distance.Spatial2.2
watermazedata$Working.Distance.Trial1.3 <- watermazedata$Distance.Spatial3.1
watermazedata$Working.Distance.Trial2.3 <- watermazedata$Distance.Spatial3.2
watermazedata$Working.Distance.Diff.3 <- watermazedata$Distance.Spatial3.1 - watermazedata$Distance.Spatial3.2
watermazedata$Working.Distance.Trial1.Ave <- (watermazedata$Distance.Spatial1.1 + watermazedata$Distance.Spatial2.1 + watermazedata$Distance.Spatial3.1) / 3
watermazedata$Working.Distance.Trial2.Ave <- (watermazedata$Distance.Spatial1.2 + watermazedata$Distance.Spatial2.2 + watermazedata$Distance.Spatial3.2) / 3
watermazedata$Working.Distance.Diff.Ave <- (watermazedata$Working.Distance.Diff.1 + watermazedata$Working.Distance.Diff.2 + watermazedata$Working.Distance.Diff.3) / 3
Create a “subset” dataframe for each group to ease making histograms/normal curves and QQ plots by group.
Ac_watermazedata<-subset(watermazedata, watermazedata$Treatment=="Ac")
Fx_watermazedata<-subset(watermazedata, watermazedata$Treatment=="Fx")
Sh_watermazedata<-subset(watermazedata, watermazedata$Treatment=="Sh")
How many subjects are missing data from a specific column? (na = ‘missing’). Make a variable that returns 1 (TRUE) if data is missing: watermazedata\(Duration.Spatial1.Missing <- is.na(watermazedata\)Duration.Spatial1)
How many subjects are missing from Duration.Spatial1 data? sum(watermazedata$Duration.Spatial1.Missing)
1 = missing, 0 = there, so mean will tell us proportion of cases missing data in that variable
….or simply calculate this WITHOUT making a new variable:
sum(is.na(watermazedata$Duration.Cued)); mean(is.na(watermazedata$Duration.Cued))
[1] 0
[1] 0
sum(is.na(watermazedata$Duration.Spatial1)); mean(is.na(watermazedata$Duration.Spatial1))
[1] 0
[1] 0
sum(is.na(watermazedata$Duration.Spatial2)); mean(is.na(watermazedata$Duration.Spatial2))
[1] 0
[1] 0
sum(is.na(watermazedata$Duration.Spatial3)); mean(is.na(watermazedata$Duration.Spatial3))
[1] 0
[1] 0
sum(is.na(watermazedata$Duration.Spatial)); mean(is.na(watermazedata$Duration.Spatial))
[1] 0
[1] 0
sum(is.na(watermazedata$Distance.Cued)); mean(is.na(watermazedata$Distance.Cued))
[1] 0
[1] 0
sum(is.na(watermazedata$Distance.Spatial1)); mean(is.na(watermazedata$Distance.Spatial1))
[1] 0
[1] 0
sum(is.na(watermazedata$Distance.Spatial2)); mean(is.na(watermazedata$Distance.Spatial2))
[1] 0
[1] 0
sum(is.na(watermazedata$Distance.Spatial3)); mean(is.na(watermazedata$Distance.Spatial3))
[1] 0
[1] 0
sum(is.na(watermazedata$Distance.Spatial)); mean(is.na(watermazedata$Distance.Spatial))
[1] 0
[1] 0
sum(is.na(watermazedata$Speed)); mean(is.na(watermazedata$Speed))
[1] 0
[1] 0
sum(is.na(watermazedata$Probe.Entries.1)); mean(is.na(watermazedata$Probe.Entries.1))
[1] 0
[1] 0
sum(is.na(watermazedata$Probe.Entries.2)); mean(is.na(watermazedata$Probe.Entries.2))
[1] 0
[1] 0
sum(is.na(watermazedata$Probe.Entries.3)); mean(is.na(watermazedata$Probe.Entries.3))
[1] 0
[1] 0
sum(is.na(watermazedata$Probe.Entries.Ave)); mean(is.na(watermazedata$Probe.Entries.Ave))
[1] 0
[1] 0
sum(is.na(watermazedata$Probe.Percent1)); mean(is.na(watermazedata$Probe.Percent1))
[1] 0
[1] 0
sum(is.na(watermazedata$Probe.Percent2)); mean(is.na(watermazedata$Probe.Percent2))
[1] 0
[1] 0
sum(is.na(watermazedata$Probe.Percent3)); mean(is.na(watermazedata$Probe.Percent3))
[1] 0
[1] 0
sum(is.na(watermazedata$Probe.Percent.Ave)); mean(is.na(watermazedata$Probe.Percent.Ave))
[1] 0
[1] 0
sum(is.na(watermazedata$Probe2.Opposite.Percent)); mean(is.na(watermazedata$Probe2.Opposite.Percent))
[1] 0
[1] 0
sum(is.na(watermazedata$Working.Duration.Trial1.Ave)); mean(is.na(watermazedata$Working.Duration.Trial1.Ave))
[1] 0
[1] 0
sum(is.na(watermazedata$Working.Duration.Trial2.Ave)); mean(is.na(watermazedata$Working.Duration.Trial2.Ave))
[1] 0
[1] 0
sum(is.na(watermazedata$Working.Duration.Diff.Ave)); mean(is.na(watermazedata$Working.Duration.Diff.Ave))
[1] 0
[1] 0
sum(is.na(watermazedata$Working.Distance.Trial1.Ave)); mean(is.na(watermazedata$Working.Distance.Trial1.Ave))
[1] 0
[1] 0
sum(is.na(watermazedata$Working.Distance.Trial2.Ave)); mean(is.na(watermazedata$Working.Distance.Trial2.Ave))
[1] 0
[1] 0
sum(is.na(watermazedata$Working.Distance.Diff.Ave)); mean(is.na(watermazedata$Working.Distance.Diff.Ave))
[1] 0
[1] 0
Now, start checking the various aussumptions (normality, homogeneity of variance, etc.) for all meaningful DVS - e.g., Average Distance and Distance for days 1-3 are probably important, but Blocks 1-5 from each are probably not (?). If the idea is to compare groups, the assumptions need to be tested with each variable broken down by group.
??? is there a “Bonferroni correction” for multiple tests of Normality etc ???
Generate some descriptive stats for the variables of interest.
NOTE: For output reported using “e”: e+02, simply “move” the decimal point 2 places to right. e-02 = move decimal 2 places to left…
Can use describe() (from the psych package) or stat.desc() function (from the pastecs package) to get some basic stats.
# describe()
# Overall DVs (not broken down by group)
# single variables: by(data = dataFrame$Variable, INDICES = dataFrame$grouping DV, FUN = function)
# by(data = watermazedata$Duration.Spatial, INDICES = watermazedata$Treatment, FUN = describe)
# or
# by(watermazedata$Duration.Spatial, watermazedata$Treatment, describe)
# multiple variables at once:
# describe(cbind(watermazedata$Duration.Cued,
# watermazedata$Duration.Spatial1,
# watermazedata$Duration.Spatial2,
# watermazedata$Duration.Spatial3,
# watermazedata$Duration.Spatial,
# watermazedata$Distance.Cued,
# watermazedata$Distance.Spatial1,
# watermazedata$Distance.Spatial2,
# watermazedata$Distance.Spatial3,
# watermazedata$Distance.Spatial,
# watermazedata$Speed,
# watermazedata$Probe.Entries.1,
# watermazedata$Probe.Entries.2,
# watermazedata$Probe.Entries.3,
# watermazedata$Probe.Entries.Ave,
# watermazedata$Probe.Percent1,
# watermazedata$Probe.Percent2,
# watermazedata$Probe.Percent3,
# watermazedata$Probe.Percent.Ave,
# watermazedata$Probe2.Opposite.Percent,
# watermazedata$Working.Duration.Trial1.Ave,
# watermazedata$Working.Duration.Trial2.Ave,
# watermazedata$Working.Duration.Diff.Ave,
# watermazedata$Working.Distance.Trial1.Ave,
# watermazedata$Working.Distance.Trial2.Ave,
# watermazedata$Working.Distance.Diff.Ave))
# or
# describe(watermazedata[,c("Duration.Spatial1",
# "Duration.Spatial2",
# "Duration.Spatial3")]); # ETC
# broken down by group
#by(cbind(Duration.Cued=watermazedata$Duration.Cued,
# Duration.Spatial1=watermazedata$Duration.Spatial1,
# Duration.Spatial2=watermazedata$Duration.Spatial2,
# Duration.Spatial3=watermazedata$Duration.Spatial3,
# Duration.Spatial=watermazedata$Duration.Spatial,
# Distance.Cued=watermazedata$Distance.Cued,
# Distance.Spatial1=watermazedata$Distance.Spatial1,
# Distance.Spatial2=watermazedata$Distance.Spatial2,
# Distance.Spatial3=watermazedata$Distance.Spatial3,
# Distance.Spatial=watermazedata$Distance.Spatial,
# Speed=watermazedata$Speed,
# Probe.Entries.1=watermazedata$Probe.Entries.1,
# Probe.Entries.2=watermazedata$Probe.Entries.2,
# Probe.Entries.3=watermazedata$Probe.Entries.3,
# Probe.Entries.Ave=watermazedata$Probe.Entries.Ave,
# Probe.Percent1=watermazedata$Probe.Percent1,
# Probe.Percent2=watermazedata$Probe.Percent2,
# Probe.Percent3=watermazedata$Probe.Percent3,
# Probe.Percent.Ave=watermazedata$Probe.Percent.Ave,
# Probe2.Opposite.Percent=watermazedata$Probe2.Opposite.Percent,
# Working.Duration.Trial1.Ave=watermazedata$Working.Duration.Trial1.Ave,
# Working.Duration.Trial2.Ave=watermazedata$Working.Duration.Trial2.Ave,
# Working.Duration.Diff.Ave=watermazedata$Working.Duration.Diff.Ave,
# Working.Distance.Trial1.Ave=watermazedata$Working.Distance.Trial1.Ave,
# Working.Distance.Trial2.Ave=watermazedata$Working.Distance.Trial2.Ave,
# Working.Distance.Diff.Ave=watermazedata$Working.Distance.Diff.Ave),
# watermazedata$Treatment, describe)
# normality of overall variables
# shapiro.test(watermazedata$Duration.Cued)
# shapiro.test(watermazedata$Duration.Spatial1)
# shapiro.test(watermazedata$Duration.Spatial2)
# shapiro.test(watermazedata$Duration.Spatial3)
# shapiro.test(watermazedata$Duration.Spatial)
# shapiro.test(watermazedata$Distance.Cued)
# shapiro.test(watermazedata$Distance.Spatial1)
# shapiro.test(watermazedata$Distance.Spatial2)
# shapiro.test(watermazedata$Distance.Spatial3)
# shapiro.test(watermazedata$Distance.Spatial)
# shapiro.test(watermazedata$Speed)
# shapiro.test(watermazedata$Probe.Entries.1)
# shapiro.test(watermazedata$Probe.Entries.2)
# shapiro.test(watermazedata$Probe.Entries.3)
# shapiro.test(watermazedata$Probe.Entries.Ave)
# shapiro.test(watermazedata$Probe.Percent1)
# shapiro.test(watermazedata$Probe.Percent2)
# shapiro.test(watermazedata$Probe.Percent3)
# shapiro.test(watermazedata$Probe.Percent.Ave)
# shapiro.test(watermazedata$Probe2.Opposite.Percent)
# shapiro.test(watermazedata$Working.Duration.Trial1.Ave)
# shapiro.test(watermazedata$Working.Duration.Trial2.Ave)
# shapiro.test(watermazedata$Working.Duration.Diff.Ave)
# shapiro.test(watermazedata$Working.Distance.Trial1.Ave)
# shapiro.test(watermazedata$Working.Distance.Trial2.Ave)
# shapiro.test(watermazedata$Working.Distance.Diff.Ave)
# normality of variables broken down by group
# by(watermazedata$Duration.Cued, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Duration.Spatial1, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Duration.Spatial2, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Duration.Spatial3, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Duration.Spatial, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Distance.Cued, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Distance.Spatial1, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Distance.Spatial2, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Distance.Spatial3, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Distance.Spatial, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Speed, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Probe.Entries.1, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Probe.Entries.2, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Probe.Entries.3, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Probe.Entries.Ave, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Probe.Percent1, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Probe.Percent2, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Probe.Percent3, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Probe.Percent.Ave, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Probe2.Opposite.Percent, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Working.Duration.Trial1.Ave, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Working.Duration.Trial2.Ave, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Working.Duration.Diff.Ave, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Working.Distance.Trial1.Ave, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Working.Distance.Trial2.Ave, watermazedata$Treatment, shapiro.test)
# by(watermazedata$Working.Distance.Diff.Ave, watermazedata$Treatment, shapiro.test)
Using stat.desc
# stat.desc()
# using basic = FALSE adds Shapiro-Wilks test, negating the need to run that separately as with describe()
# Overall DVs (not broken down by group)
stat.desc(cbind(Duration.Cued=watermazedata$Duration.Cued,
Duration.Spatial1=watermazedata$Duration.Spatial1,
Duration.Spatial2=watermazedata$Duration.Spatial2,
Duration.Spatial3=watermazedata$Duration.Spatial3,
Duration.Spatial=watermazedata$Duration.Spatial,
Distance.Cued=watermazedata$Distance.Cued,
Distance.Spatial1=watermazedata$Distance.Spatial1,
Distance.Spatial2=watermazedata$Distance.Spatial2,
Distance.Spatial3=watermazedata$Distance.Spatial3,
Distance.Spatial=watermazedata$Distance.Spatial,
Speed=watermazedata$Speed,
Probe.Entries.1=watermazedata$Probe.Entries.1,
Probe.Entries.2=watermazedata$Probe.Entries.2,
Probe.Entries.3=watermazedata$Probe.Entries.3,
Probe.Entries.Ave=watermazedata$Probe.Entries.Ave,
Probe.Percent1=watermazedata$Probe.Percent1,
Probe.Percent2=watermazedata$Probe.Percent2,
Probe.Percent3=watermazedata$Probe.Percent3,
Probe.Percent.Ave=watermazedata$Probe.Percent.Ave,
Probe2.Opposite.Percent=watermazedata$Probe2.Opposite.Percent,
Working.Duration.Trial1.Ave=watermazedata$Working.Duration.Trial1.Ave,
Working.Duration.Trial2.Ave=watermazedata$Working.Duration.Trial2.Ave,
Working.Duration.Diff.Ave=watermazedata$Working.Duration.Diff.Ave,
Working.Distance.Trial1.Ave=watermazedata$Working.Distance.Trial1.Ave,
Working.Distance.Trial2.Ave=watermazedata$Working.Distance.Trial2.Ave,
Working.Distance.Diff.Ave=watermazedata$Working.Distance.Diff.Ave),
basic = FALSE, norm = TRUE)
# or
# stat.desc(watermazedata[, c("Duration.Spatial1",
# "Duration.Spatial2",
# "Duration.Spatial3")], basic = FALSE, norm = TRUE); # ETC
# Broken down by group
# single variables: by(data = dataFrame$Variable, INDICES = dataFrame$grouping DV, FUN = function)
# by(data = watermazedata$Duration.Spatial, INDICES = watermazedata$Treatment, FUN = stat.desc)
# or
# by(watermazedata$Duration.Spatial, watermazedata$Treatment, stat.desc)
# or
# by(watermazedata$Duration.Spatial, watermazedata$Treatment, stat.desc, basic = FALSE, norm = TRUE)
# multiple variables at once:
by(cbind(Duration.Cued=watermazedata$Duration.Cued,
Duration.Spatial1=watermazedata$Duration.Spatial1,
Duration.Spatial2=watermazedata$Duration.Spatial2,
Duration.Spatial3=watermazedata$Duration.Spatial3,
Duration.Spatial=watermazedata$Duration.Spatial,
Distance.Cued=watermazedata$Distance.Cued,
Distance.Spatial1=watermazedata$Distance.Spatial1,
Distance.Spatial2=watermazedata$Distance.Spatial2,
Distance.Spatial3=watermazedata$Distance.Spatial3,
Distance.Spatial=watermazedata$Distance.Spatial,
Speed=watermazedata$Speed,
Probe.Entries.1=watermazedata$Probe.Entries.1,
Probe.Entries.2=watermazedata$Probe.Entries.2,
Probe.Entries.3=watermazedata$Probe.Entries.3,
Probe.Entries.Ave=watermazedata$Probe.Entries.Ave,
Probe.Percent1=watermazedata$Probe.Percent1,
Probe.Percent2=watermazedata$Probe.Percent2,
Probe.Percent3=watermazedata$Probe.Percent3,
Probe.Percent.Ave=watermazedata$Probe.Percent.Ave,
Probe2.Opposite.Percent=watermazedata$Probe2.Opposite.Percent),
watermazedata$Treatment, stat.desc, basic = FALSE, norm = TRUE)
INDICES: Ac
Duration.Cued Duration.Spatial1 Duration.Spatial2 Duration.Spatial3
median 22.3900000 14.36000000 15.54000000 17.19000000
mean 23.6470000 14.98000000 18.94100000 21.35800000
SE.mean 1.6968797 1.77887487 2.27763010 2.43156865
CI.mean.0.95 3.5516099 3.72322788 4.76713460 5.08933168
var 57.5880116 63.28791579 103.75197789 118.25052211
std.dev 7.5886765 7.95537025 10.18587148 10.87430559
coef.var 0.3209150 0.53106610 0.53776841 0.50914438
skewness 0.2479948 1.26212085 0.94110222 0.73566280
skew.2SE 0.2421335 1.23229118 0.91885968 0.71827573
kurtosis -1.1792491 1.97484499 0.31484533 -0.60321900
kurt.2SE -0.5941498 0.99500081 0.15863086 -0.30392430
normtest.W 0.9608703 0.87806268 0.91348508 0.91465100
normtest.p 0.5613788 0.01633146 0.07429047 0.07820961
Duration.Spatial Distance.Cued Distance.Spatial1 Distance.Spatial2
median 18.0066667 3.4727000 2.19760000 2.4629000
mean 18.4263333 3.6469100 2.34443000 2.7195600
SE.mean 1.0939434 0.2324343 0.34439751 0.3433361
CI.mean.0.95 2.2896498 0.4864905 0.72083228 0.7186106
var 23.9342432 1.0805138 2.37219293 2.3575929
std.dev 4.8922636 1.0394776 1.54019250 1.5354455
coef.var 0.2655039 0.2850297 0.65695819 0.5645934
skewness 0.2518218 0.5425664 1.34133180 0.8403708
skew.2SE 0.2458701 0.5297431 1.30963002 0.8205091
kurtosis -0.5840827 -0.8509631 2.25394485 0.3936414
kurt.2SE -0.2942827 -0.4287470 1.13562176 0.1983313
normtest.W 0.9801489 0.9417958 0.87785717 0.9280982
normtest.p 0.9360099 0.2592150 0.01619371 0.1419282
Distance.Spatial3 Distance.Spatial Speed Probe.Entries.1
median 2.34980000 2.6594667 0.1444310179 3.5000000
mean 3.08606000 2.7166833 0.1467410626 3.7000000
SE.mean 0.40930437 0.1810658 0.0023242164 0.4298102
CI.mean.0.95 0.85668390 0.3789751 0.0048646408 0.8996032
var 3.35060138 0.6556967 0.0001080396 3.6947368
std.dev 1.83046480 0.8097510 0.0103942117 1.9221698
coef.var 0.59313973 0.2980660 0.0708336951 0.5195054
skewness 0.70812629 0.6477020 -0.0297399089 0.2374009
skew.2SE 0.69139004 0.6323939 -0.0290370192 0.2317900
kurtosis -0.94451685 0.4876389 -0.4892196484 -0.4419827
kurt.2SE -0.47588294 0.2456907 -0.2464871660 -0.2226874
normtest.W 0.88665782 0.9401439 0.9760920947 0.9704263
normtest.p 0.02335664 0.2412871 0.8743843994 0.7638524
Probe.Entries.2 Probe.Entries.3 Probe.Entries.Ave Probe.Percent1
median 5.0000000 5.0000000 5.00000000 33.58500000
mean 5.4000000 4.8500000 4.60000000 34.28200000
SE.mean 0.6341177 0.5585460 0.29379549 3.17795114
CI.mean.0.95 1.3272236 1.1690503 0.61492103 6.65152819
var 8.0421053 6.2394737 1.72631579 201.98746947
std.dev 2.8358606 2.4978938 1.31389337 14.21222957
coef.var 0.5251594 0.5150297 0.28562899 0.41456827
skewness 0.7176968 0.3927197 -0.47085901 -0.05372888
skew.2SE 0.7007343 0.3834380 -0.45973047 -0.05245902
kurtosis -0.3181295 -0.3691493 -0.48631469 -1.14227338
kurt.2SE -0.1602855 -0.1859912 -0.24502354 -0.57552007
normtest.W 0.9332753 0.9271466 0.90536342 0.97187672
normtest.p 0.1784997 0.1360601 0.05203957 0.79392004
Probe.Percent2 Probe.Percent3 Probe.Percent.Ave
median 41.25000000 36.50000000 36.7500000
mean 39.20000000 33.88300000 35.7890000
SE.mean 2.56736441 1.85310608 1.2512964
CI.mean.0.95 5.37355546 3.87859561 2.6189934
var 131.82720000 68.68004316 31.3148516
std.dev 11.48160268 8.28734235 5.5959674
coef.var 0.29289803 0.24458703 0.1563600
skewness -0.94601833 -0.95143892 -0.4572726
skew.2SE -0.92365960 -0.92895208 -0.4464651
kurtosis 0.29968759 -0.21830216 -0.4986564
kurt.2SE 0.15099382 -0.10998880 -0.2512418
normtest.W 0.91907919 0.88425152 0.9543853
normtest.p 0.09512401 0.02111589 0.4385766
Probe2.Opposite.Percent
median 18.0000000
mean 20.2990000
SE.mean 1.5917789
CI.mean.0.95 3.3316314
var 50.6751989
std.dev 7.1186515
coef.var 0.3506898
skewness 0.6760278
skew.2SE 0.6600502
kurtosis -0.5215679
kurt.2SE -0.2627854
normtest.W 0.9295934
normtest.p 0.1516587
---------------------------------------------------------------
INDICES: Fx
Duration.Cued Duration.Spatial1 Duration.Spatial2 Duration.Spatial3
median 21.73000000 12.4300000 1.755000e+01 21.40000000
mean 23.37222222 12.7988889 2.153222e+01 23.43777778
SE.mean 2.23278843 1.2639398 2.967962e+00 3.15191648
CI.mean.0.95 4.71077180 2.6666798 6.261853e+00 6.64996249
var 89.73619477 28.7557869 1.585584e+02 178.82239477
std.dev 9.47291902 5.3624423 1.259200e+01 13.37244909
coef.var 0.40530673 0.4189772 5.847979e-01 0.57055107
skewness 0.81041711 0.3882022 1.272045e+00 0.50503295
skew.2SE 0.75559436 0.3619413 1.185994e+00 0.47086870
kurtosis 0.10639342 -1.0798882 7.314238e-01 -1.16154284
kurt.2SE 0.05125936 -0.5202800 3.523932e-01 -0.55962051
normtest.W 0.86919556 0.9360768 8.435289e-01 0.90640023
normtest.p 0.01725848 0.2480028 6.706633e-03 0.07435655
Duration.Spatial Distance.Cued Distance.Spatial1 Distance.Spatial2
median 19.99666667 3.69610000 1.62460000 2.210800000
mean 19.25629630 3.98997778 1.98138889 2.894511111
SE.mean 1.42361882 0.38879126 0.26145987 0.425809855
CI.mean.0.95 3.00357317 0.82027787 0.55163210 0.898380264
var 36.48042992 2.72085565 1.23050271 3.263652580
std.dev 6.03990314 1.64950164 1.10928027 1.806558214
coef.var 0.31365861 0.41341123 0.55984985 0.624132416
skewness -0.18478275 0.62065506 0.67394281 1.130473609
skew.2SE -0.17228264 0.57866925 0.62835222 1.053999812
kurtosis -1.68798788 -0.23498226 -0.86690831 0.205166745
kurt.2SE -0.81325683 -0.11321226 -0.41766834 0.098847426
normtest.W 0.88880514 0.88847894 0.90114980 0.846707522
normtest.p 0.03681698 0.03634723 0.06017156 0.007517738
Distance.Spatial3 Distance.Spatial Speed Probe.Entries.1
median 2.94920000 2.8016333 0.134896814 4.0000000
mean 3.16536667 2.6804222 0.138482061 4.3333333
SE.mean 0.48732298 0.2206222 0.004480923 0.7094138
CI.mean.0.95 1.02816161 0.4654721 0.009453920 1.4967323
var 4.27470629 0.8761347 0.000361416 9.0588235
std.dev 2.06753628 0.9360207 0.019010944 3.0097880
coef.var 0.65317434 0.3492064 0.137280918 0.6945665
skewness 0.44035925 -0.1121716 -0.109850417 0.5406443
skew.2SE 0.41057002 -0.1045835 -0.102419303 0.5040710
kurtosis -1.29548429 -1.3864203 -1.287317657 -0.7907476
kurt.2SE -0.62415226 -0.6679644 -0.620217651 -0.3809748
normtest.W 0.89269316 0.9480545 0.956655741 0.9386126
normtest.p 0.04293112 0.3953187 0.538577561 0.2743302
Probe.Entries.2 Probe.Entries.3 Probe.Entries.Ave Probe.Percent1
median 4.5000000 4.00000000 4.00000000 35.41500000
mean 4.6111111 3.61111111 4.16666667 39.11166667
SE.mean 0.5724554 0.38039272 0.45911253 3.49474089
CI.mean.0.95 1.2077753 0.80255848 0.96864276 7.37325877
var 5.8986928 2.60457516 3.79411765 219.83785000
std.dev 2.4287225 1.61386962 1.94784949 14.82692989
coef.var 0.5267109 0.44691774 0.46748388 0.37909225
skewness 0.8494462 -0.26808635 0.63646389 1.06294974
skew.2SE 0.7919832 -0.24995096 0.59340865 0.99104377
kurtosis 0.3982610 0.03711183 0.09433583 0.16236708
kurt.2SE 0.1918785 0.01788013 0.04545013 0.07822695
normtest.W 0.9326035 0.94329048 0.91525179 0.88015311
normtest.p 0.2157300 0.32956448 0.10652068 0.02625901
Probe.Percent2 Probe.Percent3 Probe.Percent.Ave
median 35.50000000 30.5000000 34.775000000
mean 37.07388889 28.4633333 34.882222222
SE.mean 2.92394623 1.9470360 1.891559435
CI.mean.0.95 6.16898729 4.1078868 3.990841562
var 153.89030752 68.2370824 64.403947712
std.dev 12.40525322 8.2605740 8.025207020
coef.var 0.33460890 0.2902181 0.230065819
skewness 0.08594422 -0.9333001 -0.006024109
skew.2SE 0.08013030 -0.8701646 -0.005616592
kurtosis -0.57837040 0.3594684 -0.002432449
kurt.2SE -0.27865347 0.1731885 -0.001171931
normtest.W 0.97685565 0.9194261 0.979925163
normtest.p 0.91192507 0.1262816 0.949237025
Probe2.Opposite.Percent
median 18.58000000
mean 20.13000000
SE.mean 2.23206915
CI.mean.0.95 4.70925426
var 89.67838824
std.dev 9.46986738
coef.var 0.47043554
skewness 0.70679512
skew.2SE 0.65898214
kurtosis 0.05188936
kurt.2SE 0.02499981
normtest.W 0.94387323
normtest.p 0.33708159
---------------------------------------------------------------
INDICES: Sh
Duration.Cued Duration.Spatial1 Duration.Spatial2 Duration.Spatial3
median 23.06000000 12.08000000 15.5400000 22.4200000
mean 25.09789474 13.82210526 19.0052632 25.8894737
SE.mean 2.63775418 1.50982350 1.8363196 2.4306471
CI.mean.0.95 5.54171590 3.17202147 3.8579644 5.1066001
var 132.19719532 43.31177310 64.0693263 112.2528608
std.dev 11.49770392 6.58116806 8.0043317 10.5949451
coef.var 0.45811428 0.47613355 0.4211640 0.4092376
skewness 0.79198208 0.83572880 0.4171269 0.6594636
skew.2SE 0.75604471 0.79780636 0.3981992 0.6295394
kurtosis -0.49113414 -0.51161321 -1.1723783 0.9363186
kurt.2SE -0.24211217 -0.25220764 -0.5779420 0.4615727
normtest.W 0.90845887 0.88784203 0.9197108 0.9276883
normtest.p 0.06936469 0.02947699 0.1117835 0.1569926
Duration.Spatial Distance.Cued Distance.Spatial1 Distance.Spatial2
median 18.8733333 3.31400000 2.33220000 2.36080000
mean 19.5722807 3.91464211 2.17807368 2.73778947
SE.mean 1.0525935 0.42612757 0.26426884 0.29181399
CI.mean.0.95 2.2114168 0.89526079 0.55520824 0.61307845
var 21.0511075 3.45010934 1.32692242 1.61795274
std.dev 4.5881486 1.85744699 1.15192119 1.27198771
coef.var 0.2344207 0.47448705 0.52887154 0.46460392
skewness 0.5303294 0.89863537 0.76850264 0.61738279
skew.2SE 0.5062650 0.85785845 0.73363069 0.58936812
kurtosis -0.3497901 -0.42806821 -0.27891088 -0.03764729
kurt.2SE -0.1724345 -0.21102284 -0.13749343 -0.01855881
normtest.W 0.9634343 0.87435266 0.90134888 0.95201279
normtest.p 0.6416063 0.01714434 0.05146746 0.42730327
Distance.Spatial3 Distance.Spatial Speed Probe.Entries.1
median 3.80020000 2.79413333 0.1534098787 5.0000000000
mean 3.98161053 2.96582456 0.1507638122 4.1578947368
SE.mean 0.40007061 0.20119798 0.0037067999 0.5029919715
CI.mean.0.95 0.84051716 0.42270127 0.0077876976 1.0567469189
var 3.04107338 0.76913191 0.0002610669 4.8070175439
std.dev 1.74386736 0.87700166 0.0161575662 2.1924911730
coef.var 0.43798040 0.29570247 0.1071713824 0.5273080036
skewness 0.27448847 1.30140677 -0.3163322606 -0.8492536425
skew.2SE 0.26203314 1.24235349 -0.3019782125 -0.8107174918
kurtosis 0.04990615 1.89038983 0.4644608256 -0.7281113771
kurt.2SE 0.02460201 0.93189689 0.2289631446 -0.3589337600
normtest.W 0.98061264 0.87112946 0.9445009017 0.7872014119
normtest.p 0.94920809 0.01509693 0.3172627904 0.0007493052
Probe.Entries.2 Probe.Entries.3 Probe.Entries.Ave Probe.Percent1
median 6.00000000 4.0000000 5.00000000 32.3300000
mean 6.42105263 4.0526316 4.78947368 33.2978947
SE.mean 0.65923839 0.5897451 0.38676154 3.2100484
CI.mean.0.95 1.38500847 1.2390085 0.81255584 6.7440615
var 8.25730994 6.6081871 2.84210526 195.7838064
std.dev 2.87355354 2.5706394 1.68585446 13.9922767
coef.var 0.44752063 0.6343136 0.35199159 0.4202151
skewness 0.38337532 0.2609263 0.51064922 -0.5070319
skew.2SE 0.36597909 0.2490864 0.48747775 -0.4840245
kurtosis -1.23833007 -1.5641787 -1.00939320 -0.4344221
kurt.2SE -0.61045395 -0.7710861 -0.49759598 -0.2141551
normtest.W 0.89668584 0.8792907 0.88283992 0.9530587
normtest.p 0.04239384 0.0208689 0.02406722 0.4447327
Probe.Percent2 Probe.Percent3 Probe.Percent.Ave
median 43.1700000 31.3300000 34.22000000
mean 42.3352632 31.9468421 35.86052632
SE.mean 2.1079617 2.2356719 1.64424594
CI.mean.0.95 4.4286632 4.6969723 3.45443254
var 84.4265485 94.9663450 51.36734971
std.dev 9.1883921 9.7450677 7.16710190
coef.var 0.2170387 0.3050401 0.19986048
skewness -0.3808935 0.5854291 -0.09526113
skew.2SE -0.3636099 0.5588644 -0.09093851
kurtosis -0.9750009 -0.8419064 -1.24496141
kurt.2SE -0.4806418 -0.4150308 -0.61372297
normtest.W 0.9472765 0.9320952 0.96071802
normtest.p 0.3548309 0.1892693 0.58660667
Probe2.Opposite.Percent
median 17.3300000
mean 17.7100000
SE.mean 1.2207154
CI.mean.0.95 2.5646280
var 28.3127778
std.dev 5.3209753
coef.var 0.3004503
skewness 0.4735778
skew.2SE 0.4520885
kurtosis -0.7236955
kurt.2SE -0.3567569
normtest.W 0.9488611
normtest.p 0.3778937
# or
# by(watermazedata[, c("Duration.Spatial1",
# "Duration.Spatial1",
# "Duration.Spatial3")],; #ETC
# watermazedata$Treatment, stat.desc, basic = FALSE, norm = TRUE)
Test for homogeneity of variance among groups using the leveneTest() function from the car package (default uses median)… to use mean instead of median - for example: leveneTest(watermazedata\(Duration.Spatial, watermazedata\)Treatment, center = mean)
leveneTest(watermazedata$Duration.Cued, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 2 0.9112 0.4081
54
leveneTest(watermazedata$Duration.Spatial1, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 2 0.3835 0.6833
54
leveneTest(watermazedata$Duration.Spatial2, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 2 0.363 0.6973
54
leveneTest(watermazedata$Duration.Spatial3, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 2 0.9983 0.3752
54
leveneTest(watermazedata$Duration.Spatial, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 2 2.4787 0.09335 .
54
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
leveneTest(watermazedata$Distance.Cued, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 2 1.2023 0.3084
54
leveneTest(watermazedata$Distance.Spatial1, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 2 0.1913 0.8265
54
leveneTest(watermazedata$Distance.Spatial2, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 2 0.4073 0.6675
54
leveneTest(watermazedata$Distance.Spatial3, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 2 0.5724 0.5676
54
leveneTest(watermazedata$Distance.Spatial, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 2 0.9525 0.3921
54
leveneTest(watermazedata$Speed, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 2 3.4883 0.0376 *
54
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
leveneTest(watermazedata$Probe.Entries.1, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 2 1.4818 0.2363
54
leveneTest(watermazedata$Probe.Entries.2, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 2 0.2239 0.8002
54
leveneTest(watermazedata$Probe.Entries.3, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 2 2.231 0.1172
54
leveneTest(watermazedata$Probe.Entries.Ave, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 2 0.9072 0.4097
54
leveneTest(watermazedata$Probe.Percent1, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 2 0.0387 0.962
54
leveneTest(watermazedata$Probe.Percent2, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 2 0.3962 0.6748
54
leveneTest(watermazedata$Probe.Percent3, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 2 0.4923 0.6139
54
leveneTest(watermazedata$Probe.Percent.Ave, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 2 0.9529 0.392
54
leveneTest(watermazedata$Probe2.Opposite.Percent, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 2 1.456 0.2422
54
leveneTest(watermazedata$Working.Duration.Trial1.Ave, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 2 0.1796 0.8361
54
leveneTest(watermazedata$Working.Duration.Trial2.Ave, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 2 0.1042 0.9012
54
leveneTest(watermazedata$Working.Duration.Diff.Ave, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 2 1.123 0.3328
54
leveneTest(watermazedata$Working.Distance.Trial1.Ave, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 2 0.3452 0.7096
54
leveneTest(watermazedata$Working.Distance.Trial2.Ave, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 2 0.0259 0.9745
54
leveneTest(watermazedata$Working.Distance.Diff.Ave, watermazedata$Treatment)
watermazedata$Treatment coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 2 0.8803 0.4205
54
# *** IF 1 OF 3 IS SIGNIFICANT [NOT NORMAL], DOES THAT REQUIRE NONPARAMETRIC? ***
Visually check each variable’s data for normality / outliers averaged across all groups. This info is probably not all that interestng until broken down by group. - Histograms w/ overlaid normal curves - Quantile–quantile (QQ) plots - Boxplots - Scatterplots - Violin plots
# Histograms with overlaid normal curve and Quantile–quantile plots
# Scatterplots:
# p <- ggplot(watermazedata, aes(x=Treatment, y=Speed)) + geom_dotplot(binaxis='y', stackdir='center')
# use geom_crossbar()
# p + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")
# Use geom_errorbar()
# p + stat_summary(fun.data=mean_sdl, fun.args = list(mult=1), geom="errorbar", color="red", width=0.2) + stat_summary(fun.y=mean, geom="point", color="red")
# Use geom_pointrange()
# p + stat_summary(fun.data=mean_sdl, fun.args = list(mult=1), geom="pointrange", color="red")
# Duration
hist.Duration.Cued <- ggplot(watermazedata, aes(Duration.Cued)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Cued Duration", y = "Number")
hist.Duration.Cued +
stat_function(fun = dnorm, args = list
(mean = mean(watermazedata$Duration.Cued, na.rm = TRUE),
sd = sd(watermazedata$Duration.Cued, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Duration.Cued <- qplot(sample = watermazedata$Duration.Cued)
qqplot.Duration.Cued

boxplot(watermazedata$Duration.Cued, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(watermazedata, aes(x=0, y=Duration.Cued, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Duration.Cued)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Duration.Cued, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Duration.Spatial1 <- ggplot(watermazedata, aes(Duration.Spatial1)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Spatial Duration", y = "Number")
hist.Duration.Spatial1 +
stat_function(fun = dnorm, args = list
(mean = mean(watermazedata$Duration.Spatial1, na.rm = TRUE),
sd = sd(watermazedata$Duration.Spatial1, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Duration.Spatial1 <- qplot(sample = watermazedata$Duration.Spatial1)
qqplot.Duration.Spatial1

boxplot(watermazedata$Duration.Spatial1, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(watermazedata, aes(x=0, y=Duration.Spatial1, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Duration.Spatial1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Duration.Spatial1, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Duration.Spatial2 <- ggplot(watermazedata, aes(Duration.Spatial2)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Spatial Duration", y = "Number")
hist.Duration.Spatial2 +
stat_function(fun = dnorm, args = list
(mean = mean(watermazedata$Duration.Spatial2, na.rm = TRUE),
sd = sd(watermazedata$Duration.Spatial2, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Duration.Spatial2 <- qplot(sample = watermazedata$Duration.Spatial2)
qqplot.Duration.Spatial2

boxplot(watermazedata$Duration.Spatial2, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(watermazedata, aes(x=0, y=Duration.Spatial2, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Duration.Spatial2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Duration.Spatial2, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Duration.Spatial3 <- ggplot(watermazedata, aes(Duration.Spatial3)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Spatial Duration", y = "Number")
hist.Duration.Spatial3 +
stat_function(fun = dnorm, args = list
(mean = mean(watermazedata$Duration.Spatial3, na.rm = TRUE),
sd = sd(watermazedata$Duration.Spatial3, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Duration.Spatial3 <- qplot(sample = watermazedata$Duration.Spatial3)
qqplot.Duration.Spatial3

boxplot(watermazedata$Duration.Spatial3, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(watermazedata, aes(x=0, y=Duration.Spatial3, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Duration.Spatial3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Duration.Spatial3, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Duration.Spatial <- ggplot(watermazedata, aes(Duration.Spatial)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Spatial Duration", y = "Number")
hist.Duration.Spatial +
stat_function(fun = dnorm, args = list
(mean = mean(watermazedata$Duration.Spatial, na.rm = TRUE),
sd = sd(watermazedata$Duration.Spatial, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Duration.Spatial <- qplot(sample = watermazedata$Duration.Spatial)
qqplot.Duration.Spatial

boxplot(watermazedata$Duration.Spatial, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(watermazedata, aes(x=0, y=Duration.Spatial, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Duration.Spatial)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Duration.Spatial, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

# Distance
hist.Distance.Cued <- ggplot(watermazedata, aes(Distance.Cued)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Cued Distance", y = "Number")
hist.Distance.Cued +
stat_function(fun = dnorm, args = list
(mean = mean(watermazedata$Distance.Cued, na.rm = TRUE),
sd = sd(watermazedata$Distance.Cued, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Distance.Cued <- qplot(sample = watermazedata$Distance.Cued)
qqplot.Distance.Cued

boxplot(watermazedata$Distance.Cued, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(watermazedata, aes(x=0, y=Distance.Cued, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Distance.Cued)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Distance.Cued, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Distance.Spatial1 <- ggplot(watermazedata, aes(Distance.Spatial1)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Spatial Distance", y = "Number")
hist.Distance.Spatial1 +
stat_function(fun = dnorm, args = list
(mean = mean(watermazedata$Distance.Spatial1, na.rm = TRUE),
sd = sd(watermazedata$Distance.Spatial1, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Distance.Spatial1 <- qplot(sample = watermazedata$Distance.Spatial1)
qqplot.Distance.Spatial1

boxplot(watermazedata$Distance.Spatial1, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(watermazedata, aes(x=0, y=Distance.Spatial1, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Distance.Spatial1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Distance.Spatial1, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Distance.Spatial2 <- ggplot(watermazedata, aes(Distance.Spatial2)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Spatial Distance", y = "Number")
hist.Distance.Spatial2 +
stat_function(fun = dnorm, args = list
(mean = mean(watermazedata$Distance.Spatial2, na.rm = TRUE),
sd = sd(watermazedata$Distance.Spatial2, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Distance.Spatial2 <- qplot(sample = watermazedata$Distance.Spatial2)
qqplot.Distance.Spatial2

boxplot(watermazedata$Distance.Spatial2, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(watermazedata, aes(x=0, y=Distance.Spatial2, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Distance.Spatial2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Distance.Spatial2, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Distance.Spatial3 <- ggplot(watermazedata, aes(Distance.Spatial3)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Spatial Distance", y = "Number")
hist.Distance.Spatial3 +
stat_function(fun = dnorm, args = list
(mean = mean(watermazedata$Distance.Spatial3, na.rm = TRUE),
sd = sd(watermazedata$Distance.Spatial3, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Distance.Spatial3 <- qplot(sample = watermazedata$Distance.Spatial3)
qqplot.Distance.Spatial3

boxplot(watermazedata$Distance.Spatial3, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(watermazedata, aes(x=0, y=Distance.Spatial3, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Distance.Spatial3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Distance.Spatial3, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Distance.Spatial <- ggplot(watermazedata, aes(Distance.Spatial)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Spatial Distance", y = "Number")
hist.Distance.Spatial +
stat_function(fun = dnorm, args = list
(mean = mean(watermazedata$Distance.Spatial, na.rm = TRUE),
sd = sd(watermazedata$Distance.Spatial, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Distance.Spatial <- qplot(sample = watermazedata$Distance.Spatial)
qqplot.Distance.Spatial

boxplot(watermazedata$Distance.Spatial, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(watermazedata, aes(x=0, y=Distance.Spatial, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Distance.Spatial)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Distance.Spatial, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

# Speed
hist.Speed <- ggplot(watermazedata, aes(Speed)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Speed", y = "Number")
hist.Speed +
stat_function(fun = dnorm, args = list
(mean = mean(watermazedata$Speed, na.rm = TRUE),
sd = sd(watermazedata$Speed, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Speed <- qplot(sample = watermazedata$Speed)
qqplot.Speed

boxplot(watermazedata$Speed, main="Boxplots by Group", xlab="Group", ylab="Speed")

ggplot(watermazedata, aes(x=0, y=Speed, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Speed)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Speed, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

# Probe stuff
hist.Probe.Entries.1 <- ggplot(watermazedata, aes(Probe.Entries.1)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Entries", y = "Number")
hist.Probe.Entries.1 +
stat_function(fun = dnorm, args = list
(mean = mean(watermazedata$Probe.Entries.1, na.rm = TRUE),
sd = sd(watermazedata$Probe.Entries.1, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Probe.Entries.1 <- qplot(sample = watermazedata$Probe.Entries.1)
qqplot.Probe.Entries.1

boxplot(watermazedata$Probe.Entries.1, main="Boxplots by Group", xlab="Group", ylab="Entries")

ggplot(watermazedata, aes(x=0, y=Probe.Entries.1, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Probe.Entries.1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Probe.Entries.1, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Probe.Entries.2 <- ggplot(watermazedata, aes(Probe.Entries.2)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Entries", y = "Number")
hist.Probe.Entries.2 +
stat_function(fun = dnorm, args = list
(mean = mean(watermazedata$Probe.Entries.2, na.rm = TRUE),
sd = sd(watermazedata$Probe.Entries.2, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Probe.Entries.2 <- qplot(sample = watermazedata$Probe.Entries.2)
qqplot.Probe.Entries.2

boxplot(watermazedata$Probe.Entries.2, main="Boxplots by Group", xlab="Group", ylab="Entries")

ggplot(watermazedata, aes(x=0, y=Probe.Entries.2, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Probe.Entries.2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Probe.Entries.2, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Probe.Entries.3 <- ggplot(watermazedata, aes(Probe.Entries.3)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Entries", y = "Number")
hist.Probe.Entries.3 +
stat_function(fun = dnorm, args = list
(mean = mean(watermazedata$Probe.Entries.3, na.rm = TRUE),
sd = sd(watermazedata$Probe.Entries.3, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Probe.Entries.3 <- qplot(sample = watermazedata$Probe.Entries.3)
qqplot.Probe.Entries.3

boxplot(watermazedata$Probe.Entries.3, main="Boxplots by Group", xlab="Group", ylab="Entries")

ggplot(watermazedata, aes(x=0, y=Probe.Entries.3, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Probe.Entries.3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Probe.Entries.3, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Probe.Entries.Ave <- ggplot(watermazedata, aes(Probe.Entries.Ave)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Entries", y = "Number")
hist.Probe.Entries.Ave +
stat_function(fun = dnorm, args = list
(mean = mean(watermazedata$Probe.Entries.Ave, na.rm = TRUE),
sd = sd(watermazedata$Probe.Entries.Ave, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Probe.Entries.Ave <- qplot(sample = watermazedata$Probe.Entries.Ave)
qqplot.Probe.Entries.Ave

boxplot(watermazedata$Probe.Entries.Ave, main="Boxplots by Group", xlab="Group", ylab="Entries")

ggplot(watermazedata, aes(x=0, y=Probe.Entries.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Probe.Entries.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Probe.Entries.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Probe.Percent1 <- ggplot(watermazedata, aes(Probe.Percent1)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Percent", y = "Number")
hist.Probe.Percent1 +
stat_function(fun = dnorm, args = list
(mean = mean(watermazedata$Probe.Percent1, na.rm = TRUE),
sd = sd(watermazedata$Probe.Percent1, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Probe.Percent1 <- qplot(sample = watermazedata$Probe.Percent1)
qqplot.Probe.Percent1

boxplot(watermazedata$Probe.Percent1, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(watermazedata, aes(x=0, y=Probe.Percent1, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Probe.Percent1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Probe.Percent1, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Probe.Percent2 <- ggplot(watermazedata, aes(Probe.Percent2)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Percent", y = "Number")
hist.Probe.Percent2 +
stat_function(fun = dnorm, args = list
(mean = mean(watermazedata$Probe.Percent2, na.rm = TRUE),
sd = sd(watermazedata$Probe.Percent2, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Probe.Percent2 <- qplot(sample = watermazedata$Probe.Percent2)
qqplot.Probe.Percent2

boxplot(watermazedata$Probe.Percent2, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(watermazedata, aes(x=0, y=Probe.Percent2, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Probe.Percent2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Probe.Percent2, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Probe.Percent3 <- ggplot(watermazedata, aes(Probe.Percent3)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Percent", y = "Number")
hist.Probe.Percent3 +
stat_function(fun = dnorm, args = list
(mean = mean(watermazedata$Probe.Percent3, na.rm = TRUE),
sd = sd(watermazedata$Probe.Percent3, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Probe.Percent3 <- qplot(sample = watermazedata$Probe.Percent3)
qqplot.Probe.Percent3

boxplot(watermazedata$Probe.Percent3, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(watermazedata, aes(x=0, y=Probe.Percent3, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Probe.Percent3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Probe.Percent3, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Probe.Percent.Ave <- ggplot(watermazedata, aes(Probe.Percent.Ave)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Percent", y = "Number")
hist.Probe.Percent.Ave +
stat_function(fun = dnorm, args = list
(mean = mean(watermazedata$Probe.Percent.Ave, na.rm = TRUE),
sd = sd(watermazedata$Probe.Percent.Ave, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Probe.Percent.Ave <- qplot(sample = watermazedata$Probe.Percent.Ave)
qqplot.Probe.Percent.Ave

boxplot(watermazedata$Probe.Percent.Ave, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(watermazedata, aes(x=0, y=Probe.Percent.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Probe.Percent.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Probe.Percent.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Probe2.Opposite.Percent <- ggplot(watermazedata, aes(Probe2.Opposite.Percent)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Percent", y = "Number")
hist.Probe2.Opposite.Percent +
stat_function(fun = dnorm, args = list
(mean = mean(watermazedata$Probe2.Opposite.Percent, na.rm = TRUE),
sd = sd(watermazedata$Probe2.Opposite.Percent, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Probe2.Opposite.Percent <- qplot(sample = watermazedata$Probe2.Opposite.Percent)
qqplot.Probe2.Opposite.Percent

boxplot(watermazedata$Probe2.Opposite.Percent, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(watermazedata, aes(x=0, y=Probe2.Opposite.Percent, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Probe2.Opposite.Percent)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Probe2.Opposite.Percent, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

# Working memory stuff
hist.Working.Duration.Trial1.Ave <- ggplot(watermazedata, aes(Working.Duration.Trial1.Ave)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Duration", y = "Number")
hist.Working.Duration.Trial1.Ave +
stat_function(fun = dnorm, args = list
(mean = mean(watermazedata$Working.Duration.Trial1.Ave, na.rm = TRUE),
sd = sd(watermazedata$Working.Duration.Trial1.Ave, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Working.Duration.Trial1.Ave <- qplot(sample = watermazedata$Working.Duration.Trial1.Ave)
qqplot.Working.Duration.Trial1.Ave

boxplot(watermazedata$Working.Duration.Trial1.Ave, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(watermazedata, aes(x=0, y=Working.Duration.Trial1.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Working.Duration.Trial1.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Working.Duration.Trial1.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Working.Duration.Trial2.Ave <- ggplot(watermazedata, aes(Working.Duration.Trial2.Ave)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Duration", y = "Number")
hist.Working.Duration.Trial2.Ave +
stat_function(fun = dnorm, args = list
(mean = mean(watermazedata$Working.Duration.Trial2.Ave, na.rm = TRUE),
sd = sd(watermazedata$Working.Duration.Trial2.Ave, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Working.Duration.Trial2.Ave <- qplot(sample = watermazedata$Working.Duration.Trial2.Ave)
qqplot.Working.Duration.Trial2.Ave

boxplot(watermazedata$Working.Duration.Trial2.Ave, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(watermazedata, aes(x=0, y=Working.Duration.Trial2.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Working.Duration.Trial2.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Working.Duration.Trial2.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Working.Duration.Diff.Ave <- ggplot(watermazedata, aes(Working.Duration.Diff.Ave)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Duration", y = "Number")
hist.Working.Duration.Diff.Ave +
stat_function(fun = dnorm, args = list
(mean = mean(watermazedata$Working.Duration.Diff.Ave, na.rm = TRUE),
sd = sd(watermazedata$Working.Duration.Diff.Ave, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Working.Duration.Diff.Ave <- qplot(sample = watermazedata$Working.Duration.Diff.Ave)
qqplot.Working.Duration.Diff.Ave

boxplot(watermazedata$Working.Duration.Diff.Ave, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(watermazedata, aes(x=0, y=Working.Duration.Diff.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Working.Duration.Diff.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Working.Duration.Diff.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Working.Distance.Trial1.Ave <- ggplot(watermazedata, aes(Working.Distance.Trial1.Ave)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Distance", y = "Number")
hist.Working.Distance.Trial1.Ave +
stat_function(fun = dnorm, args = list
(mean = mean(watermazedata$Working.Distance.Trial1.Ave, na.rm = TRUE),
sd = sd(watermazedata$Working.Distance.Trial1.Ave, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Working.Distance.Trial1.Ave <- qplot(sample = watermazedata$Working.Distance.Trial1.Ave)
qqplot.Working.Distance.Trial1.Ave

boxplot(watermazedata$Working.Distance.Trial1.Ave, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(watermazedata, aes(x=0, y=Working.Distance.Trial1.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Working.Distance.Trial1.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Working.Distance.Trial1.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Working.Distance.Trial2.Ave <- ggplot(watermazedata, aes(Working.Distance.Trial2.Ave)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Distance", y = "Number")
hist.Working.Distance.Trial2.Ave +
stat_function(fun = dnorm, args = list
(mean = mean(watermazedata$Working.Distance.Trial2.Ave, na.rm = TRUE),
sd = sd(watermazedata$Working.Distance.Trial2.Ave, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Working.Distance.Trial2.Ave <- qplot(sample = watermazedata$Working.Distance.Trial2.Ave)
qqplot.Working.Distance.Trial2.Ave

boxplot(watermazedata$Working.Distance.Trial2.Ave, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(watermazedata, aes(x=0, y=Working.Distance.Trial2.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Working.Distance.Trial2.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Working.Distance.Trial2.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Working.Distance.Diff.Ave <- ggplot(watermazedata, aes(Working.Distance.Diff.Ave)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Distance", y = "Number")
hist.Working.Distance.Diff.Ave +
stat_function(fun = dnorm, args = list
(mean = mean(watermazedata$Working.Distance.Diff.Ave, na.rm = TRUE),
sd = sd(watermazedata$Working.Distance.Diff.Ave, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Working.Distance.Diff.Ave <- qplot(sample = watermazedata$Working.Distance.Diff.Ave)
qqplot.Working.Distance.Diff.Ave

boxplot(watermazedata$Working.Distance.Diff.Ave, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(watermazedata, aes(x=0, y=Working.Distance.Diff.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=0, y=Working.Distance.Diff.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=0, y=Working.Distance.Diff.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

Now, visually check each variable data for normality / outliers broken down by group - histograms and QQ plots and box plots for each Treatment group.
# Broken down by group (use the "subset" dataframes that were derived earlier)
# Ac
# Duration
hist.Duration.Cued <- ggplot(Ac_watermazedata, aes(Duration.Cued)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Cued Duration", y = "Number")
hist.Duration.Cued +
stat_function(fun = dnorm, args = list
(mean = mean(Ac_watermazedata$Duration.Cued, na.rm = TRUE),
sd = sd(Ac_watermazedata$Duration.Cued, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Duration.Cued <- qplot(sample = Ac_watermazedata$Duration.Cued)
qqplot.Duration.Cued

boxplot(Ac_watermazedata$Duration.Cued, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Duration.Cued, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Duration.Cued)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Duration.Cued, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Duration.Spatial1 <- ggplot(Ac_watermazedata, aes(Duration.Spatial1)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Spatial Duration", y = "Number")
hist.Duration.Spatial1 +
stat_function(fun = dnorm, args = list
(mean = mean(Ac_watermazedata$Duration.Spatial1, na.rm = TRUE),
sd = sd(Ac_watermazedata$Duration.Spatial1, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Duration.Spatial1 <- qplot(sample = Ac_watermazedata$Duration.Spatial1)
qqplot.Duration.Spatial1

boxplot(Ac_watermazedata$Duration.Spatial1, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Duration.Spatial1, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Duration.Spatial1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Duration.Spatial1, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Duration.Spatial2 <- ggplot(Ac_watermazedata, aes(Duration.Spatial2)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Spatial Duration", y = "Number")
hist.Duration.Spatial2 +
stat_function(fun = dnorm, args = list
(mean = mean(Ac_watermazedata$Duration.Spatial2, na.rm = TRUE),
sd = sd(Ac_watermazedata$Duration.Spatial2, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Duration.Spatial2 <- qplot(sample = Ac_watermazedata$Duration.Spatial2)
qqplot.Duration.Spatial2

boxplot(Ac_watermazedata$Duration.Spatial2, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Duration.Spatial2, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Duration.Spatial2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Duration.Spatial2, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Duration.Spatial3 <- ggplot(Ac_watermazedata, aes(Duration.Spatial3)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Spatial Duration", y = "Number")
hist.Duration.Spatial3 +
stat_function(fun = dnorm, args = list
(mean = mean(Ac_watermazedata$Duration.Spatial3, na.rm = TRUE),
sd = sd(Ac_watermazedata$Duration.Spatial3, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Duration.Spatial3 <- qplot(sample = Ac_watermazedata$Duration.Spatial3)
qqplot.Duration.Spatial3

boxplot(Ac_watermazedata$Duration.Spatial3, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Duration.Spatial3, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Duration.Spatial3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Duration.Spatial3, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Duration.Spatial <- ggplot(Ac_watermazedata, aes(Duration.Spatial)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Spatial Duration", y = "Number")
hist.Duration.Spatial +
stat_function(fun = dnorm, args = list
(mean = mean(Ac_watermazedata$Duration.Spatial, na.rm = TRUE),
sd = sd(Ac_watermazedata$Duration.Spatial, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Duration.Spatial <- qplot(sample = Ac_watermazedata$Duration.Spatial)
qqplot.Duration.Spatial

boxplot(Ac_watermazedata$Duration.Spatial, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Duration.Spatial, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Duration.Spatial)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Duration.Spatial, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

# Distance
hist.Distance.Cued <- ggplot(Ac_watermazedata, aes(Distance.Cued)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Cued Distance", y = "Number")
hist.Distance.Cued +
stat_function(fun = dnorm, args = list
(mean = mean(Ac_watermazedata$Distance.Cued, na.rm = TRUE),
sd = sd(Ac_watermazedata$Distance.Cued, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Distance.Cued <- qplot(sample = Ac_watermazedata$Distance.Cued)
qqplot.Distance.Cued

boxplot(Ac_watermazedata$Distance.Cued, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Distance.Cued, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Distance.Cued)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Distance.Cued, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Distance.Spatial1 <- ggplot(Ac_watermazedata, aes(Distance.Spatial1)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Spatial Distance", y = "Number")
hist.Distance.Spatial1 +
stat_function(fun = dnorm, args = list
(mean = mean(Ac_watermazedata$Distance.Spatial1, na.rm = TRUE),
sd = sd(Ac_watermazedata$Distance.Spatial1, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Distance.Spatial1 <- qplot(sample = Ac_watermazedata$Distance.Spatial1)
qqplot.Distance.Spatial1

boxplot(Ac_watermazedata$Distance.Spatial1, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Distance.Spatial1, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Distance.Spatial1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Distance.Spatial1, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Distance.Spatial2 <- ggplot(Ac_watermazedata, aes(Distance.Spatial2)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Spatial Distance", y = "Number")
hist.Distance.Spatial2 +
stat_function(fun = dnorm, args = list
(mean = mean(Ac_watermazedata$Distance.Spatial2, na.rm = TRUE),
sd = sd(Ac_watermazedata$Distance.Spatial2, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Distance.Spatial2 <- qplot(sample = Ac_watermazedata$Distance.Spatial2)
qqplot.Distance.Spatial2

boxplot(Ac_watermazedata$Distance.Spatial2, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Distance.Spatial2, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Distance.Spatial2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Distance.Spatial2, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Distance.Spatial3 <- ggplot(Ac_watermazedata, aes(Distance.Spatial3)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Spatial Distance", y = "Number")
hist.Distance.Spatial3 +
stat_function(fun = dnorm, args = list
(mean = mean(Ac_watermazedata$Distance.Spatial3, na.rm = TRUE),
sd = sd(Ac_watermazedata$Distance.Spatial3, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Distance.Spatial3 <- qplot(sample = Ac_watermazedata$Distance.Spatial3)
qqplot.Distance.Spatial3

boxplot(Ac_watermazedata$Distance.Spatial3, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Distance.Spatial3, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Distance.Spatial3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Distance.Spatial3, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Distance.Spatial <- ggplot(Ac_watermazedata, aes(Distance.Spatial)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Spatial Distance", y = "Number")
hist.Distance.Spatial +
stat_function(fun = dnorm, args = list
(mean = mean(Ac_watermazedata$Distance.Spatial, na.rm = TRUE),
sd = sd(Ac_watermazedata$Distance.Spatial, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Distance.Spatial <- qplot(sample = Ac_watermazedata$Distance.Spatial)
qqplot.Distance.Spatial

boxplot(Ac_watermazedata$Distance.Spatial, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Distance.Spatial, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Distance.Spatial)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Distance.Spatial, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

# Speed
hist.Speed <- ggplot(Ac_watermazedata, aes(Speed)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Speed", y = "Number")
hist.Speed +
stat_function(fun = dnorm, args = list
(mean = mean(Ac_watermazedata$Speed, na.rm = TRUE),
sd = sd(Ac_watermazedata$Speed, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Speed <- qplot(sample = Ac_watermazedata$Speed)
qqplot.Speed

boxplot(Ac_watermazedata$Speed, main="Boxplots by Group", xlab="Group", ylab="Speed")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Speed, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Speed)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Speed, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

# Probe stuff
hist.Probe.Entries.1 <- ggplot(Ac_watermazedata, aes(Probe.Entries.1)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Entries", y = "Number")
hist.Probe.Entries.1 +
stat_function(fun = dnorm, args = list
(mean = mean(Ac_watermazedata$Probe.Entries.1, na.rm = TRUE),
sd = sd(Ac_watermazedata$Probe.Entries.1, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Probe.Entries.1 <- qplot(sample = Ac_watermazedata$Probe.Entries.1)
qqplot.Probe.Entries.1

boxplot(Ac_watermazedata$Probe.Entries.1, main="Boxplots by Group", xlab="Group", ylab="Entries")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Entries.1, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Entries.1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Entries.1, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Probe.Entries.2 <- ggplot(Ac_watermazedata, aes(Probe.Entries.2)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Entries", y = "Number")
hist.Probe.Entries.2 +
stat_function(fun = dnorm, args = list
(mean = mean(Ac_watermazedata$Probe.Entries.2, na.rm = TRUE),
sd = sd(Ac_watermazedata$Probe.Entries.2, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Probe.Entries.2 <- qplot(sample = Ac_watermazedata$Probe.Entries.2)
qqplot.Probe.Entries.2

boxplot(Ac_watermazedata$Probe.Entries.2, main="Boxplots by Group", xlab="Group", ylab="Entries")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Entries.2, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Entries.2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Entries.2, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Probe.Entries.3 <- ggplot(Ac_watermazedata, aes(Probe.Entries.3)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Entries", y = "Number")
hist.Probe.Entries.3 +
stat_function(fun = dnorm, args = list
(mean = mean(Ac_watermazedata$Probe.Entries.3, na.rm = TRUE),
sd = sd(Ac_watermazedata$Probe.Entries.3, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Probe.Entries.3 <- qplot(sample = Ac_watermazedata$Probe.Entries.3)
qqplot.Probe.Entries.3

boxplot(Ac_watermazedata$Probe.Entries.3, main="Boxplots by Group", xlab="Group", ylab="Entries")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Entries.3, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Entries.3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Entries.3, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Probe.Entries.Ave <- ggplot(Ac_watermazedata, aes(Probe.Entries.Ave)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Entries", y = "Number")
hist.Probe.Entries.Ave +
stat_function(fun = dnorm, args = list
(mean = mean(Ac_watermazedata$Probe.Entries.Ave, na.rm = TRUE),
sd = sd(Ac_watermazedata$Probe.Entries.Ave, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Probe.Entries.Ave <- qplot(sample = Ac_watermazedata$Probe.Entries.Ave)
qqplot.Probe.Entries.Ave

boxplot(Ac_watermazedata$Probe.Entries.Ave, main="Boxplots by Group", xlab="Group", ylab="Entries")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Entries.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Entries.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Entries.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Probe.Percent1 <- ggplot(Ac_watermazedata, aes(Probe.Percent1)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Percent", y = "Number")
hist.Probe.Percent1 +
stat_function(fun = dnorm, args = list
(mean = mean(Ac_watermazedata$Probe.Percent1, na.rm = TRUE),
sd = sd(Ac_watermazedata$Probe.Percent1, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Probe.Percent1 <- qplot(sample = Ac_watermazedata$Probe.Percent1)
qqplot.Probe.Percent1

boxplot(Ac_watermazedata$Probe.Percent1, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Percent1, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Percent1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Percent1, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Probe.Percent2 <- ggplot(Ac_watermazedata, aes(Probe.Percent2)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Percent", y = "Number")
hist.Probe.Percent2 +
stat_function(fun = dnorm, args = list
(mean = mean(Ac_watermazedata$Probe.Percent2, na.rm = TRUE),
sd = sd(Ac_watermazedata$Probe.Percent2, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Probe.Percent2 <- qplot(sample = Ac_watermazedata$Probe.Percent2)
qqplot.Probe.Percent2

boxplot(Ac_watermazedata$Probe.Percent2, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Percent2, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Percent2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Percent2, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Probe.Percent3 <- ggplot(Ac_watermazedata, aes(Probe.Percent3)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Percent", y = "Number")
hist.Probe.Percent3 +
stat_function(fun = dnorm, args = list
(mean = mean(Ac_watermazedata$Probe.Percent3, na.rm = TRUE),
sd = sd(Ac_watermazedata$Probe.Percent3, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Probe.Percent3 <- qplot(sample = Ac_watermazedata$Probe.Percent3)
qqplot.Probe.Percent3

boxplot(Ac_watermazedata$Probe.Percent3, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Percent3, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Percent3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Percent3, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Probe.Percent.Ave <- ggplot(Ac_watermazedata, aes(Probe.Percent.Ave)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Percent", y = "Number")
hist.Probe.Percent.Ave +
stat_function(fun = dnorm, args = list
(mean = mean(Ac_watermazedata$Probe.Percent.Ave, na.rm = TRUE),
sd = sd(Ac_watermazedata$Probe.Percent.Ave, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Probe.Percent.Ave <- qplot(sample = Ac_watermazedata$Probe.Percent.Ave)
qqplot.Probe.Percent.Ave

boxplot(Ac_watermazedata$Probe.Percent.Ave, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Percent.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Percent.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe.Percent.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Probe2.Opposite.Percent <- ggplot(Ac_watermazedata, aes(Probe2.Opposite.Percent)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Percent", y = "Number")
hist.Probe2.Opposite.Percent +
stat_function(fun = dnorm, args = list
(mean = mean(Ac_watermazedata$Probe2.Opposite.Percent, na.rm = TRUE),
sd = sd(Ac_watermazedata$Probe2.Opposite.Percent, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Probe2.Opposite.Percent <- qplot(sample = Ac_watermazedata$Probe2.Opposite.Percent)
qqplot.Probe2.Opposite.Percent

boxplot(Ac_watermazedata$Probe2.Opposite.Percent, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe2.Opposite.Percent, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe2.Opposite.Percent)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Probe2.Opposite.Percent, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

# Working memory stuff
hist.Working.Duration.Trial1.Ave <- ggplot(Ac_watermazedata, aes(Working.Duration.Trial1.Ave)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Duration", y = "Number")
hist.Working.Duration.Trial1.Ave +
stat_function(fun = dnorm, args = list
(mean = mean(Ac_watermazedata$Working.Duration.Trial1.Ave, na.rm = TRUE),
sd = sd(Ac_watermazedata$Working.Duration.Trial1.Ave, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Working.Duration.Trial1.Ave <- qplot(sample = Ac_watermazedata$Working.Duration.Trial1.Ave)
qqplot.Working.Duration.Trial1.Ave

boxplot(Ac_watermazedata$Working.Duration.Trial1.Ave, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Working.Duration.Trial1.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Working.Duration.Trial1.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Working.Duration.Trial1.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Working.Duration.Trial2.Ave <- ggplot(Ac_watermazedata, aes(Working.Duration.Trial2.Ave)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Duration", y = "Number")
hist.Working.Duration.Trial2.Ave +
stat_function(fun = dnorm, args = list
(mean = mean(Ac_watermazedata$Working.Duration.Trial2.Ave, na.rm = TRUE),
sd = sd(Ac_watermazedata$Working.Duration.Trial2.Ave, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Working.Duration.Trial2.Ave <- qplot(sample = Ac_watermazedata$Working.Duration.Trial2.Ave)
qqplot.Working.Duration.Trial2.Ave

boxplot(Ac_watermazedata$Working.Duration.Trial2.Ave, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Working.Duration.Trial2.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Working.Duration.Trial2.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Working.Duration.Trial2.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Working.Duration.Diff.Ave <- ggplot(Ac_watermazedata, aes(Working.Duration.Diff.Ave)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Duration", y = "Number")
hist.Working.Duration.Diff.Ave +
stat_function(fun = dnorm, args = list
(mean = mean(Ac_watermazedata$Working.Duration.Diff.Ave, na.rm = TRUE),
sd = sd(Ac_watermazedata$Working.Duration.Diff.Ave, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Working.Duration.Diff.Ave <- qplot(sample = Ac_watermazedata$Working.Duration.Diff.Ave)
qqplot.Working.Duration.Diff.Ave

boxplot(Ac_watermazedata$Working.Duration.Diff.Ave, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Working.Duration.Diff.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Working.Duration.Diff.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Working.Duration.Diff.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Working.Distance.Trial1.Ave <- ggplot(Ac_watermazedata, aes(Working.Distance.Trial1.Ave)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Distance", y = "Number")
hist.Working.Distance.Trial1.Ave +
stat_function(fun = dnorm, args = list
(mean = mean(Ac_watermazedata$Working.Distance.Trial1.Ave, na.rm = TRUE),
sd = sd(Ac_watermazedata$Working.Distance.Trial1.Ave, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Working.Distance.Trial1.Ave <- qplot(sample = Ac_watermazedata$Working.Distance.Trial1.Ave)
qqplot.Working.Distance.Trial1.Ave

boxplot(Ac_watermazedata$Working.Distance.Trial1.Ave, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Working.Distance.Trial1.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Working.Distance.Trial1.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Working.Distance.Trial1.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Working.Distance.Trial2.Ave <- ggplot(Ac_watermazedata, aes(Working.Distance.Trial2.Ave)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Distance", y = "Number")
hist.Working.Distance.Trial2.Ave +
stat_function(fun = dnorm, args = list
(mean = mean(Ac_watermazedata$Working.Distance.Trial2.Ave, na.rm = TRUE),
sd = sd(Ac_watermazedata$Working.Distance.Trial2.Ave, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Working.Distance.Trial2.Ave <- qplot(sample = Ac_watermazedata$Working.Distance.Trial2.Ave)
qqplot.Working.Distance.Trial2.Ave

boxplot(Ac_watermazedata$Working.Distance.Trial2.Ave, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Working.Distance.Trial2.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Working.Distance.Trial2.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Working.Distance.Trial2.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Working.Distance.Diff.Ave <- ggplot(Ac_watermazedata, aes(Working.Distance.Diff.Ave)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Distance", y = "Number")
hist.Working.Distance.Diff.Ave +
stat_function(fun = dnorm, args = list
(mean = mean(Ac_watermazedata$Working.Distance.Diff.Ave, na.rm = TRUE),
sd = sd(Ac_watermazedata$Working.Distance.Diff.Ave, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Working.Distance.Diff.Ave <- qplot(sample = Ac_watermazedata$Working.Distance.Diff.Ave)
qqplot.Working.Distance.Diff.Ave

boxplot(Ac_watermazedata$Working.Distance.Diff.Ave, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Working.Distance.Diff.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Ac_watermazedata, aes(x=Treatment, y=Working.Distance.Diff.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Ac_watermazedata, aes(x=Treatment, y=Working.Distance.Diff.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

# Fx
# Duration
hist.Duration.Cued <- ggplot(Fx_watermazedata, aes(Duration.Cued)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Cued Duration", y = "Number")
hist.Duration.Cued +
stat_function(fun = dnorm, args = list
(mean = mean(Fx_watermazedata$Duration.Cued, na.rm = TRUE),
sd = sd(Fx_watermazedata$Duration.Cued, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Duration.Cued <- qplot(sample = Fx_watermazedata$Duration.Cued)
qqplot.Duration.Cued

boxplot(Fx_watermazedata$Duration.Cued, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Duration.Cued, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Duration.Cued)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Duration.Cued, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Duration.Spatial1 <- ggplot(Fx_watermazedata, aes(Duration.Spatial1)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Spatial Duration", y = "Number")
hist.Duration.Spatial1 +
stat_function(fun = dnorm, args = list
(mean = mean(Fx_watermazedata$Duration.Spatial1, na.rm = TRUE),
sd = sd(Fx_watermazedata$Duration.Spatial1, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Duration.Spatial1 <- qplot(sample = Fx_watermazedata$Duration.Spatial1)
qqplot.Duration.Spatial1

boxplot(Fx_watermazedata$Duration.Spatial1, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Duration.Spatial1, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Duration.Spatial1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Duration.Spatial1, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Duration.Spatial2 <- ggplot(Fx_watermazedata, aes(Duration.Spatial2)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Spatial Duration", y = "Number")
hist.Duration.Spatial2 +
stat_function(fun = dnorm, args = list
(mean = mean(Fx_watermazedata$Duration.Spatial2, na.rm = TRUE),
sd = sd(Fx_watermazedata$Duration.Spatial2, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Duration.Spatial2 <- qplot(sample = Fx_watermazedata$Duration.Spatial2)
qqplot.Duration.Spatial2

boxplot(Fx_watermazedata$Duration.Spatial2, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Duration.Spatial2, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Duration.Spatial2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Duration.Spatial2, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Duration.Spatial3 <- ggplot(Fx_watermazedata, aes(Duration.Spatial3)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Spatial Duration", y = "Number")
hist.Duration.Spatial3 +
stat_function(fun = dnorm, args = list
(mean = mean(Fx_watermazedata$Duration.Spatial3, na.rm = TRUE),
sd = sd(Fx_watermazedata$Duration.Spatial3, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Duration.Spatial3 <- qplot(sample = Fx_watermazedata$Duration.Spatial3)
qqplot.Duration.Spatial3

boxplot(Fx_watermazedata$Duration.Spatial3, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Duration.Spatial3, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Duration.Spatial3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Duration.Spatial3, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Duration.Spatial <- ggplot(Fx_watermazedata, aes(Duration.Spatial)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Spatial Duration", y = "Number")
hist.Duration.Spatial +
stat_function(fun = dnorm, args = list
(mean = mean(Fx_watermazedata$Duration.Spatial, na.rm = TRUE),
sd = sd(Fx_watermazedata$Duration.Spatial, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Duration.Spatial <- qplot(sample = Fx_watermazedata$Duration.Spatial)
qqplot.Duration.Spatial

boxplot(Fx_watermazedata$Duration.Spatial, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Duration.Spatial, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Duration.Spatial)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Duration.Spatial, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

# Distance
hist.Distance.Cued <- ggplot(Fx_watermazedata, aes(Distance.Cued)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Cued Distance", y = "Number")
hist.Distance.Cued +
stat_function(fun = dnorm, args = list
(mean = mean(Fx_watermazedata$Distance.Cued, na.rm = TRUE),
sd = sd(Fx_watermazedata$Distance.Cued, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Distance.Cued <- qplot(sample = Fx_watermazedata$Distance.Cued)
qqplot.Distance.Cued

boxplot(Fx_watermazedata$Distance.Cued, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Distance.Cued, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Distance.Cued)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Distance.Cued, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Distance.Spatial1 <- ggplot(Fx_watermazedata, aes(Distance.Spatial1)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Spatial Distance", y = "Number")
hist.Distance.Spatial1 +
stat_function(fun = dnorm, args = list
(mean = mean(Fx_watermazedata$Distance.Spatial1, na.rm = TRUE),
sd = sd(Fx_watermazedata$Distance.Spatial1, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Distance.Spatial1 <- qplot(sample = Fx_watermazedata$Distance.Spatial1)
qqplot.Distance.Spatial1

boxplot(Fx_watermazedata$Distance.Spatial1, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Distance.Spatial1, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Distance.Spatial1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Distance.Spatial1, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Distance.Spatial2 <- ggplot(Fx_watermazedata, aes(Distance.Spatial2)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Spatial Distance", y = "Number")
hist.Distance.Spatial2 +
stat_function(fun = dnorm, args = list
(mean = mean(Fx_watermazedata$Distance.Spatial2, na.rm = TRUE),
sd = sd(Fx_watermazedata$Distance.Spatial2, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Distance.Spatial2 <- qplot(sample = Fx_watermazedata$Distance.Spatial2)
qqplot.Distance.Spatial2

boxplot(Fx_watermazedata$Distance.Spatial2, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Distance.Spatial2, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Distance.Spatial2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Distance.Spatial2, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Distance.Spatial3 <- ggplot(Fx_watermazedata, aes(Distance.Spatial3)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Spatial Distance", y = "Number")
hist.Distance.Spatial3 +
stat_function(fun = dnorm, args = list
(mean = mean(Fx_watermazedata$Distance.Spatial3, na.rm = TRUE),
sd = sd(Fx_watermazedata$Distance.Spatial3, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Distance.Spatial3 <- qplot(sample = Fx_watermazedata$Distance.Spatial3)
qqplot.Distance.Spatial3

boxplot(Fx_watermazedata$Distance.Spatial3, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Distance.Spatial3, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Distance.Spatial3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Distance.Spatial3, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Distance.Spatial <- ggplot(Fx_watermazedata, aes(Distance.Spatial)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Spatial Distance", y = "Number")
hist.Distance.Spatial +
stat_function(fun = dnorm, args = list
(mean = mean(Fx_watermazedata$Distance.Spatial, na.rm = TRUE),
sd = sd(Fx_watermazedata$Distance.Spatial, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Distance.Spatial <- qplot(sample = Fx_watermazedata$Distance.Spatial)
qqplot.Distance.Spatial

boxplot(Fx_watermazedata$Distance.Spatial, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Distance.Spatial, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Distance.Spatial)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Distance.Spatial, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

# Speed
hist.Speed <- ggplot(Fx_watermazedata, aes(Speed)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Speed", y = "Number")
hist.Speed +
stat_function(fun = dnorm, args = list
(mean = mean(Fx_watermazedata$Speed, na.rm = TRUE),
sd = sd(Fx_watermazedata$Speed, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Speed <- qplot(sample = Fx_watermazedata$Speed)
qqplot.Speed

boxplot(Fx_watermazedata$Speed, main="Boxplots by Group", xlab="Group", ylab="Speed")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Speed, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Speed)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Speed, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

# Probe stuff
hist.Probe.Entries.1 <- ggplot(Fx_watermazedata, aes(Probe.Entries.1)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Entries", y = "Number")
hist.Probe.Entries.1 +
stat_function(fun = dnorm, args = list
(mean = mean(Fx_watermazedata$Probe.Entries.1, na.rm = TRUE),
sd = sd(Fx_watermazedata$Probe.Entries.1, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Probe.Entries.1 <- qplot(sample = Fx_watermazedata$Probe.Entries.1)
qqplot.Probe.Entries.1

boxplot(Fx_watermazedata$Probe.Entries.1, main="Boxplots by Group", xlab="Group", ylab="Entries")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Entries.1, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Entries.1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Entries.1, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Probe.Entries.2 <- ggplot(Fx_watermazedata, aes(Probe.Entries.2)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Entries", y = "Number")
hist.Probe.Entries.2 +
stat_function(fun = dnorm, args = list
(mean = mean(Fx_watermazedata$Probe.Entries.2, na.rm = TRUE),
sd = sd(Fx_watermazedata$Probe.Entries.2, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Probe.Entries.2 <- qplot(sample = Fx_watermazedata$Probe.Entries.2)
qqplot.Probe.Entries.2

boxplot(Fx_watermazedata$Probe.Entries.2, main="Boxplots by Group", xlab="Group", ylab="Entries")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Entries.2, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Entries.2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Entries.2, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Probe.Entries.3 <- ggplot(Fx_watermazedata, aes(Probe.Entries.3)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Entries", y = "Number")
hist.Probe.Entries.3 +
stat_function(fun = dnorm, args = list
(mean = mean(Fx_watermazedata$Probe.Entries.3, na.rm = TRUE),
sd = sd(Fx_watermazedata$Probe.Entries.3, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Probe.Entries.3 <- qplot(sample = Fx_watermazedata$Probe.Entries.3)
qqplot.Probe.Entries.3

boxplot(Fx_watermazedata$Probe.Entries.3, main="Boxplots by Group", xlab="Group", ylab="Entries")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Entries.3, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Entries.3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Entries.3, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Probe.Entries.Ave <- ggplot(Fx_watermazedata, aes(Probe.Entries.Ave)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Entries", y = "Number")
hist.Probe.Entries.Ave +
stat_function(fun = dnorm, args = list
(mean = mean(Fx_watermazedata$Probe.Entries.Ave, na.rm = TRUE),
sd = sd(Fx_watermazedata$Probe.Entries.Ave, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Probe.Entries.Ave <- qplot(sample = Fx_watermazedata$Probe.Entries.Ave)
qqplot.Probe.Entries.Ave

boxplot(Fx_watermazedata$Probe.Entries.Ave, main="Boxplots by Group", xlab="Group", ylab="Entries")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Entries.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Entries.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Entries.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Probe.Percent1 <- ggplot(Fx_watermazedata, aes(Probe.Percent1)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Percent", y = "Number")
hist.Probe.Percent1 +
stat_function(fun = dnorm, args = list
(mean = mean(Fx_watermazedata$Probe.Percent1, na.rm = TRUE),
sd = sd(Fx_watermazedata$Probe.Percent1, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Probe.Percent1 <- qplot(sample = Fx_watermazedata$Probe.Percent1)
qqplot.Probe.Percent1

boxplot(Fx_watermazedata$Probe.Percent1, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Percent1, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Percent1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Percent1, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Probe.Percent2 <- ggplot(Fx_watermazedata, aes(Probe.Percent2)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Percent", y = "Number")
hist.Probe.Percent2 +
stat_function(fun = dnorm, args = list
(mean = mean(Fx_watermazedata$Probe.Percent2, na.rm = TRUE),
sd = sd(Fx_watermazedata$Probe.Percent2, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Probe.Percent2 <- qplot(sample = Fx_watermazedata$Probe.Percent2)
qqplot.Probe.Percent2

boxplot(Fx_watermazedata$Probe.Percent2, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Percent2, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Percent2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Percent2, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Probe.Percent3 <- ggplot(Fx_watermazedata, aes(Probe.Percent3)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Percent", y = "Number")
hist.Probe.Percent3 +
stat_function(fun = dnorm, args = list
(mean = mean(Fx_watermazedata$Probe.Percent3, na.rm = TRUE),
sd = sd(Fx_watermazedata$Probe.Percent3, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Probe.Percent3 <- qplot(sample = Fx_watermazedata$Probe.Percent3)
qqplot.Probe.Percent3

boxplot(Fx_watermazedata$Probe.Percent3, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Percent3, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Percent3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Percent3, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Probe.Percent.Ave <- ggplot(Fx_watermazedata, aes(Probe.Percent.Ave)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Percent", y = "Number")
hist.Probe.Percent.Ave +
stat_function(fun = dnorm, args = list
(mean = mean(Fx_watermazedata$Probe.Percent.Ave, na.rm = TRUE),
sd = sd(Fx_watermazedata$Probe.Percent.Ave, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Probe.Percent.Ave <- qplot(sample = Fx_watermazedata$Probe.Percent.Ave)
qqplot.Probe.Percent.Ave

boxplot(Fx_watermazedata$Probe.Percent.Ave, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Percent.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Percent.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe.Percent.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Probe2.Opposite.Percent <- ggplot(Fx_watermazedata, aes(Probe2.Opposite.Percent)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Percent", y = "Number")
hist.Probe2.Opposite.Percent +
stat_function(fun = dnorm, args = list
(mean = mean(Fx_watermazedata$Probe2.Opposite.Percent, na.rm = TRUE),
sd = sd(Fx_watermazedata$Probe2.Opposite.Percent, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Probe2.Opposite.Percent <- qplot(sample = Fx_watermazedata$Probe2.Opposite.Percent)
qqplot.Probe2.Opposite.Percent

boxplot(Fx_watermazedata$Probe2.Opposite.Percent, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe2.Opposite.Percent, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe2.Opposite.Percent)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Probe2.Opposite.Percent, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

# Working memory stuff
hist.Working.Duration.Trial1.Ave <- ggplot(Fx_watermazedata, aes(Working.Duration.Trial1.Ave)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Duration", y = "Number")
hist.Working.Duration.Trial1.Ave +
stat_function(fun = dnorm, args = list
(mean = mean(Fx_watermazedata$Working.Duration.Trial1.Ave, na.rm = TRUE),
sd = sd(Fx_watermazedata$Working.Duration.Trial1.Ave, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Working.Duration.Trial1.Ave <- qplot(sample = Fx_watermazedata$Working.Duration.Trial1.Ave)
qqplot.Working.Duration.Trial1.Ave

boxplot(Fx_watermazedata$Working.Duration.Trial1.Ave, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Working.Duration.Trial1.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Working.Duration.Trial1.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Working.Duration.Trial1.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Working.Duration.Trial2.Ave <- ggplot(Fx_watermazedata, aes(Working.Duration.Trial2.Ave)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Duration", y = "Number")
hist.Working.Duration.Trial2.Ave +
stat_function(fun = dnorm, args = list
(mean = mean(Fx_watermazedata$Working.Duration.Trial2.Ave, na.rm = TRUE),
sd = sd(Fx_watermazedata$Working.Duration.Trial2.Ave, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Working.Duration.Trial2.Ave <- qplot(sample = Fx_watermazedata$Working.Duration.Trial2.Ave)
qqplot.Working.Duration.Trial2.Ave

boxplot(Fx_watermazedata$Working.Duration.Trial2.Ave, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Working.Duration.Trial2.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Working.Duration.Trial2.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Working.Duration.Trial2.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Working.Duration.Diff.Ave <- ggplot(Fx_watermazedata, aes(Working.Duration.Diff.Ave)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Duration", y = "Number")
hist.Working.Duration.Diff.Ave +
stat_function(fun = dnorm, args = list
(mean = mean(Fx_watermazedata$Working.Duration.Diff.Ave, na.rm = TRUE),
sd = sd(Fx_watermazedata$Working.Duration.Diff.Ave, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Working.Duration.Diff.Ave <- qplot(sample = Fx_watermazedata$Working.Duration.Diff.Ave)
qqplot.Working.Duration.Diff.Ave

boxplot(Fx_watermazedata$Working.Duration.Diff.Ave, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Working.Duration.Diff.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Working.Duration.Diff.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Working.Duration.Diff.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Working.Distance.Trial1.Ave <- ggplot(Fx_watermazedata, aes(Working.Distance.Trial1.Ave)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Distance", y = "Number")
hist.Working.Distance.Trial1.Ave +
stat_function(fun = dnorm, args = list
(mean = mean(Fx_watermazedata$Working.Distance.Trial1.Ave, na.rm = TRUE),
sd = sd(Fx_watermazedata$Working.Distance.Trial1.Ave, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Working.Distance.Trial1.Ave <- qplot(sample = Fx_watermazedata$Working.Distance.Trial1.Ave)
qqplot.Working.Distance.Trial1.Ave

boxplot(Fx_watermazedata$Working.Distance.Trial1.Ave, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Working.Distance.Trial1.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Working.Distance.Trial1.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Working.Distance.Trial1.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Working.Distance.Trial2.Ave <- ggplot(Fx_watermazedata, aes(Working.Distance.Trial2.Ave)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Distance", y = "Number")
hist.Working.Distance.Trial2.Ave +
stat_function(fun = dnorm, args = list
(mean = mean(Fx_watermazedata$Working.Distance.Trial2.Ave, na.rm = TRUE),
sd = sd(Fx_watermazedata$Working.Distance.Trial2.Ave, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Working.Distance.Trial2.Ave <- qplot(sample = Fx_watermazedata$Working.Distance.Trial2.Ave)
qqplot.Working.Distance.Trial2.Ave

boxplot(Fx_watermazedata$Working.Distance.Trial2.Ave, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Working.Distance.Trial2.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Working.Distance.Trial2.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Working.Distance.Trial2.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Working.Distance.Diff.Ave <- ggplot(Fx_watermazedata, aes(Working.Distance.Diff.Ave)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Distance", y = "Number")
hist.Working.Distance.Diff.Ave +
stat_function(fun = dnorm, args = list
(mean = mean(Fx_watermazedata$Working.Distance.Diff.Ave, na.rm = TRUE),
sd = sd(Fx_watermazedata$Working.Distance.Diff.Ave, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Working.Distance.Diff.Ave <- qplot(sample = Fx_watermazedata$Working.Distance.Diff.Ave)
qqplot.Working.Distance.Diff.Ave

boxplot(Fx_watermazedata$Working.Distance.Diff.Ave, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Working.Distance.Diff.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Fx_watermazedata, aes(x=Treatment, y=Working.Distance.Diff.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Fx_watermazedata, aes(x=Treatment, y=Working.Distance.Diff.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

# Sh
# Duration
hist.Duration.Cued <- ggplot(Sh_watermazedata, aes(Duration.Cued)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Cued Duration", y = "Number")
hist.Duration.Cued +
stat_function(fun = dnorm, args = list
(mean = mean(Sh_watermazedata$Duration.Cued, na.rm = TRUE),
sd = sd(Sh_watermazedata$Duration.Cued, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Duration.Cued <- qplot(sample = Sh_watermazedata$Duration.Cued)
qqplot.Duration.Cued

boxplot(Sh_watermazedata$Duration.Cued, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Duration.Cued, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Duration.Cued)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Duration.Cued, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Duration.Spatial1 <- ggplot(Sh_watermazedata, aes(Duration.Spatial1)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Spatial Duration", y = "Number")
hist.Duration.Spatial1 +
stat_function(fun = dnorm, args = list
(mean = mean(Sh_watermazedata$Duration.Spatial1, na.rm = TRUE),
sd = sd(Sh_watermazedata$Duration.Spatial1, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Duration.Spatial1 <- qplot(sample = Sh_watermazedata$Duration.Spatial1)
qqplot.Duration.Spatial1

boxplot(Sh_watermazedata$Duration.Spatial1, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Duration.Spatial1, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Duration.Spatial1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Duration.Spatial1, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Duration.Spatial2 <- ggplot(Sh_watermazedata, aes(Duration.Spatial2)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Spatial Duration", y = "Number")
hist.Duration.Spatial2 +
stat_function(fun = dnorm, args = list
(mean = mean(Sh_watermazedata$Duration.Spatial2, na.rm = TRUE),
sd = sd(Sh_watermazedata$Duration.Spatial2, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Duration.Spatial2 <- qplot(sample = Sh_watermazedata$Duration.Spatial2)
qqplot.Duration.Spatial2

boxplot(Sh_watermazedata$Duration.Spatial2, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Duration.Spatial2, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Duration.Spatial2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Duration.Spatial2, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Duration.Spatial3 <- ggplot(Sh_watermazedata, aes(Duration.Spatial3)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Spatial Duration", y = "Number")
hist.Duration.Spatial3 +
stat_function(fun = dnorm, args = list
(mean = mean(Sh_watermazedata$Duration.Spatial3, na.rm = TRUE),
sd = sd(Sh_watermazedata$Duration.Spatial3, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Duration.Spatial3 <- qplot(sample = Sh_watermazedata$Duration.Spatial3)
qqplot.Duration.Spatial3

boxplot(Sh_watermazedata$Duration.Spatial3, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Duration.Spatial3, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Duration.Spatial3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Duration.Spatial3, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Duration.Spatial <- ggplot(Sh_watermazedata, aes(Duration.Spatial)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Spatial Duration", y = "Number")
hist.Duration.Spatial +
stat_function(fun = dnorm, args = list
(mean = mean(Sh_watermazedata$Duration.Spatial, na.rm = TRUE),
sd = sd(Sh_watermazedata$Duration.Spatial, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Duration.Spatial <- qplot(sample = Sh_watermazedata$Duration.Spatial)
qqplot.Duration.Spatial

boxplot(Sh_watermazedata$Duration.Spatial, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Duration.Spatial, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Duration.Spatial)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Duration.Spatial, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

# Distance
hist.Distance.Cued <- ggplot(Sh_watermazedata, aes(Distance.Cued)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Cued Distance", y = "Number")
hist.Distance.Cued +
stat_function(fun = dnorm, args = list
(mean = mean(Sh_watermazedata$Distance.Cued, na.rm = TRUE),
sd = sd(Sh_watermazedata$Distance.Cued, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Distance.Cued <- qplot(sample = Sh_watermazedata$Distance.Cued)
qqplot.Distance.Cued

boxplot(Sh_watermazedata$Distance.Cued, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Distance.Cued, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Distance.Cued)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Distance.Cued, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Distance.Spatial1 <- ggplot(Sh_watermazedata, aes(Distance.Spatial1)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Spatial Distance", y = "Number")
hist.Distance.Spatial1 +
stat_function(fun = dnorm, args = list
(mean = mean(Sh_watermazedata$Distance.Spatial1, na.rm = TRUE),
sd = sd(Sh_watermazedata$Distance.Spatial1, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Distance.Spatial1 <- qplot(sample = Sh_watermazedata$Distance.Spatial1)
qqplot.Distance.Spatial1

boxplot(Sh_watermazedata$Distance.Spatial1, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Distance.Spatial1, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Distance.Spatial1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Distance.Spatial1, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Distance.Spatial2 <- ggplot(Sh_watermazedata, aes(Distance.Spatial2)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Spatial Distance", y = "Number")
hist.Distance.Spatial2 +
stat_function(fun = dnorm, args = list
(mean = mean(Sh_watermazedata$Distance.Spatial2, na.rm = TRUE),
sd = sd(Sh_watermazedata$Distance.Spatial2, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Distance.Spatial2 <- qplot(sample = Sh_watermazedata$Distance.Spatial2)
qqplot.Distance.Spatial2

boxplot(Sh_watermazedata$Distance.Spatial2, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Distance.Spatial2, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Distance.Spatial2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Distance.Spatial2, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Distance.Spatial3 <- ggplot(Sh_watermazedata, aes(Distance.Spatial3)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Spatial Distance", y = "Number")
hist.Distance.Spatial3 +
stat_function(fun = dnorm, args = list
(mean = mean(Sh_watermazedata$Distance.Spatial3, na.rm = TRUE),
sd = sd(Sh_watermazedata$Distance.Spatial3, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Distance.Spatial3 <- qplot(sample = Sh_watermazedata$Distance.Spatial3)
qqplot.Distance.Spatial3

boxplot(Sh_watermazedata$Distance.Spatial3, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Distance.Spatial3, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Distance.Spatial3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Distance.Spatial3, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Distance.Spatial <- ggplot(Sh_watermazedata, aes(Distance.Spatial)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Spatial Distance", y = "Number")
hist.Distance.Spatial +
stat_function(fun = dnorm, args = list
(mean = mean(Sh_watermazedata$Distance.Spatial, na.rm = TRUE),
sd = sd(Sh_watermazedata$Distance.Spatial, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Distance.Spatial <- qplot(sample = Sh_watermazedata$Distance.Spatial)
qqplot.Distance.Spatial

boxplot(Sh_watermazedata$Distance.Spatial, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Distance.Spatial, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Distance.Spatial)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Distance.Spatial, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

# Speed
hist.Speed <- ggplot(Sh_watermazedata, aes(Speed)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Speed", y = "Number")
hist.Speed +
stat_function(fun = dnorm, args = list
(mean = mean(Sh_watermazedata$Speed, na.rm = TRUE),
sd = sd(Sh_watermazedata$Speed, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Speed <- qplot(sample = Sh_watermazedata$Speed)
qqplot.Speed

boxplot(Sh_watermazedata$Speed, main="Boxplots by Group", xlab="Group", ylab="Speed")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Speed, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Speed)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Speed, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

# Probe stuff
hist.Probe.Entries.1 <- ggplot(Sh_watermazedata, aes(Probe.Entries.1)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Average Entries", y = "Number")
hist.Probe.Entries.1 +
stat_function(fun = dnorm, args = list
(mean = mean(Sh_watermazedata$Probe.Entries.1, na.rm = TRUE),
sd = sd(Sh_watermazedata$Probe.Entries.1, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Probe.Entries.1 <- qplot(sample = Sh_watermazedata$Probe.Entries.1)
qqplot.Probe.Entries.1

boxplot(Sh_watermazedata$Probe.Entries.1, main="Boxplots by Group", xlab="Group", ylab="Entries")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Entries.1, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Entries.1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Entries.1, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Probe.Entries.2 <- ggplot(Sh_watermazedata, aes(Probe.Entries.2)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Entries", y = "Number")
hist.Probe.Entries.2 +
stat_function(fun = dnorm, args = list
(mean = mean(Sh_watermazedata$Probe.Entries.2, na.rm = TRUE),
sd = sd(Sh_watermazedata$Probe.Entries.2, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Probe.Entries.2 <- qplot(sample = Sh_watermazedata$Probe.Entries.2)
qqplot.Probe.Entries.2

boxplot(Sh_watermazedata$Probe.Entries.2, main="Boxplots by Group", xlab="Group", ylab="Entries")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Entries.2, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Entries.2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Entries.2, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Probe.Entries.3 <- ggplot(Sh_watermazedata, aes(Probe.Entries.3)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Entries", y = "Number")
hist.Probe.Entries.3 +
stat_function(fun = dnorm, args = list
(mean = mean(Sh_watermazedata$Probe.Entries.3, na.rm = TRUE),
sd = sd(Sh_watermazedata$Probe.Entries.3, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Probe.Entries.3 <- qplot(sample = Sh_watermazedata$Probe.Entries.3)
qqplot.Probe.Entries.3

boxplot(Sh_watermazedata$Probe.Entries.3, main="Boxplots by Group", xlab="Group", ylab="Entries")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Entries.3, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Entries.3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Entries.3, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Probe.Entries.Ave <- ggplot(Sh_watermazedata, aes(Probe.Entries.Ave)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Entries", y = "Number")
hist.Probe.Entries.Ave +
stat_function(fun = dnorm, args = list
(mean = mean(Sh_watermazedata$Probe.Entries.Ave, na.rm = TRUE),
sd = sd(Sh_watermazedata$Probe.Entries.Ave, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Probe.Entries.Ave <- qplot(sample = Sh_watermazedata$Probe.Entries.Ave)
qqplot.Probe.Entries.Ave

boxplot(Sh_watermazedata$Probe.Entries.Ave, main="Boxplots by Group", xlab="Group", ylab="Entries")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Entries.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Entries.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Entries.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Probe.Percent1 <- ggplot(Sh_watermazedata, aes(Probe.Percent1)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Percent", y = "Number")
hist.Probe.Percent1 +
stat_function(fun = dnorm, args = list
(mean = mean(Sh_watermazedata$Probe.Percent1, na.rm = TRUE),
sd = sd(Sh_watermazedata$Probe.Percent1, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Probe.Percent1 <- qplot(sample = Sh_watermazedata$Probe.Percent1)
qqplot.Probe.Percent1

boxplot(Sh_watermazedata$Probe.Percent1, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Percent1, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Percent1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Percent1, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Probe.Percent2 <- ggplot(Sh_watermazedata, aes(Probe.Percent2)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Percent", y = "Number")
hist.Probe.Percent2 +
stat_function(fun = dnorm, args = list
(mean = mean(Sh_watermazedata$Probe.Percent2, na.rm = TRUE),
sd = sd(Sh_watermazedata$Probe.Percent2, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Probe.Percent2 <- qplot(sample = Sh_watermazedata$Probe.Percent2)
qqplot.Probe.Percent2

boxplot(Sh_watermazedata$Probe.Percent2, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Percent2, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Percent2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Percent2, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Probe.Percent3 <- ggplot(Sh_watermazedata, aes(Probe.Percent3)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Percent", y = "Number")
hist.Probe.Percent3 +
stat_function(fun = dnorm, args = list
(mean = mean(Sh_watermazedata$Probe.Percent3, na.rm = TRUE),
sd = sd(Sh_watermazedata$Probe.Percent3, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Probe.Percent3 <- qplot(sample = Sh_watermazedata$Probe.Percent3)
qqplot.Probe.Percent3

boxplot(Sh_watermazedata$Probe.Percent3, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Percent3, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Percent3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Percent3, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Probe.Percent.Ave <- ggplot(Sh_watermazedata, aes(Probe.Percent.Ave)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Percent", y = "Number")
hist.Probe.Percent.Ave +
stat_function(fun = dnorm, args = list
(mean = mean(Sh_watermazedata$Probe.Percent.Ave, na.rm = TRUE),
sd = sd(Sh_watermazedata$Probe.Percent.Ave, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Probe.Percent.Ave <- qplot(sample = Sh_watermazedata$Probe.Percent.Ave)
qqplot.Probe.Percent.Ave

boxplot(Sh_watermazedata$Probe.Percent.Ave, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Percent.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Percent.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe.Percent.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Probe2.Opposite.Percent <- ggplot(Sh_watermazedata, aes(Probe2.Opposite.Percent)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Percent", y = "Number")
hist.Probe2.Opposite.Percent +
stat_function(fun = dnorm, args = list
(mean = mean(Sh_watermazedata$Probe2.Opposite.Percent, na.rm = TRUE),
sd = sd(Sh_watermazedata$Probe2.Opposite.Percent, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Probe2.Opposite.Percent <- qplot(sample = Sh_watermazedata$Probe2.Opposite.Percent)
qqplot.Probe2.Opposite.Percent

boxplot(Sh_watermazedata$Probe2.Opposite.Percent, main="Boxplots by Group", xlab="Group", ylab="Percent")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe2.Opposite.Percent, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe2.Opposite.Percent)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Probe2.Opposite.Percent, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

# Working memory stuff
hist.Working.Duration.Trial1.Ave <- ggplot(Sh_watermazedata, aes(Working.Duration.Trial1.Ave)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Duration", y = "Number")
hist.Working.Duration.Trial1.Ave +
stat_function(fun = dnorm, args = list
(mean = mean(Sh_watermazedata$Working.Duration.Trial1.Ave, na.rm = TRUE),
sd = sd(Sh_watermazedata$Working.Duration.Trial1.Ave, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Working.Duration.Trial1.Ave <- qplot(sample = Sh_watermazedata$Working.Duration.Trial1.Ave)
qqplot.Working.Duration.Trial1.Ave

boxplot(Sh_watermazedata$Working.Duration.Trial1.Ave, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Working.Duration.Trial1.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Working.Duration.Trial1.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Working.Duration.Trial1.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Working.Duration.Trial2.Ave <- ggplot(Sh_watermazedata, aes(Working.Duration.Trial2.Ave)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Duration", y = "Number")
hist.Working.Duration.Trial2.Ave +
stat_function(fun = dnorm, args = list
(mean = mean(Sh_watermazedata$Working.Duration.Trial2.Ave, na.rm = TRUE),
sd = sd(Sh_watermazedata$Working.Duration.Trial2.Ave, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Working.Duration.Trial2.Ave <- qplot(sample = Sh_watermazedata$Working.Duration.Trial2.Ave)
qqplot.Working.Duration.Trial2.Ave

boxplot(Sh_watermazedata$Working.Duration.Trial2.Ave, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Working.Duration.Trial2.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Working.Duration.Trial2.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Working.Duration.Trial2.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Working.Duration.Diff.Ave <- ggplot(Sh_watermazedata, aes(Working.Duration.Diff.Ave)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Duration", y = "Number")
hist.Working.Duration.Diff.Ave +
stat_function(fun = dnorm, args = list
(mean = mean(Sh_watermazedata$Working.Duration.Diff.Ave, na.rm = TRUE),
sd = sd(Sh_watermazedata$Working.Duration.Diff.Ave, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Working.Duration.Diff.Ave <- qplot(sample = Sh_watermazedata$Working.Duration.Diff.Ave)
qqplot.Working.Duration.Diff.Ave

boxplot(Sh_watermazedata$Working.Duration.Diff.Ave, main="Boxplots by Group", xlab="Group", ylab="Duration")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Working.Duration.Diff.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Working.Duration.Diff.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Working.Duration.Diff.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Working.Distance.Trial1.Ave <- ggplot(Sh_watermazedata, aes(Working.Distance.Trial1.Ave)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Distance", y = "Number")
hist.Working.Distance.Trial1.Ave +
stat_function(fun = dnorm, args = list
(mean = mean(Sh_watermazedata$Working.Distance.Trial1.Ave, na.rm = TRUE),
sd = sd(Sh_watermazedata$Working.Distance.Trial1.Ave, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Working.Distance.Trial1.Ave <- qplot(sample = Sh_watermazedata$Working.Distance.Trial1.Ave)
qqplot.Working.Distance.Trial1.Ave

boxplot(Sh_watermazedata$Working.Distance.Trial1.Ave, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Working.Distance.Trial1.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Working.Distance.Trial1.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Working.Distance.Trial1.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Working.Distance.Trial2.Ave <- ggplot(Sh_watermazedata, aes(Working.Distance.Trial2.Ave)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Distance", y = "Number")
hist.Working.Distance.Trial2.Ave +
stat_function(fun = dnorm, args = list
(mean = mean(Sh_watermazedata$Working.Distance.Trial2.Ave, na.rm = TRUE),
sd = sd(Sh_watermazedata$Working.Distance.Trial2.Ave, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Working.Distance.Trial2.Ave <- qplot(sample = Sh_watermazedata$Working.Distance.Trial2.Ave)
qqplot.Working.Distance.Trial2.Ave

boxplot(Sh_watermazedata$Working.Distance.Trial2.Ave, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Working.Distance.Trial2.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Working.Distance.Trial2.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Working.Distance.Trial2.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

hist.Working.Distance.Diff.Ave <- ggplot(Sh_watermazedata, aes(Working.Distance.Diff.Ave)) +
geom_histogram(aes(y = ..density..), colour = "black", fill = "white") +
labs(x = "Distance", y = "Number")
hist.Working.Distance.Diff.Ave +
stat_function(fun = dnorm, args = list
(mean = mean(Sh_watermazedata$Working.Distance.Diff.Ave, na.rm = TRUE),
sd = sd(Sh_watermazedata$Working.Distance.Diff.Ave, na.rm = TRUE)),
colour = "black", size = 1)

qqplot.Working.Distance.Diff.Ave <- qplot(sample = Sh_watermazedata$Working.Distance.Diff.Ave)
qqplot.Working.Distance.Diff.Ave

boxplot(Sh_watermazedata$Working.Distance.Diff.Ave, main="Boxplots by Group", xlab="Group", ylab="Distance")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Working.Distance.Diff.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(Sh_watermazedata, aes(x=Treatment, y=Working.Distance.Diff.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(Sh_watermazedata, aes(x=Treatment, y=Working.Distance.Diff.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

Now visually compare groups against each other
# Broken down by group all on 1 graph
# Duration
ggplot(watermazedata, aes(x=Treatment, y=Duration.Cued, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Duration.Cued)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Duration.Cued, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

ggplot(watermazedata, aes(x=Treatment, y=Duration.Spatial1, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Duration.Spatial1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Duration.Spatial1, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

ggplot(watermazedata, aes(x=Treatment, y=Duration.Spatial2, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Duration.Spatial2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Duration.Spatial2, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

ggplot(watermazedata, aes(x=Treatment, y=Duration.Spatial3, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Duration.Spatial3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Duration.Spatial3, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

ggplot(watermazedata, aes(x=Treatment, y=Duration.Spatial, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Duration.Spatial)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Duration.Spatial, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

# Distance
ggplot(watermazedata, aes(x=Treatment, y=Distance.Cued, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Distance.Cued)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Distance.Cued, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

ggplot(watermazedata, aes(x=Treatment, y=Distance.Spatial1, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Distance.Spatial1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Distance.Spatial1, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

ggplot(watermazedata, aes(x=Treatment, y=Distance.Spatial2, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Distance.Spatial2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Distance.Spatial2, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

ggplot(watermazedata, aes(x=Treatment, y=Distance.Spatial3, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Distance.Spatial3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Distance.Spatial3, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

ggplot(watermazedata, aes(x=Treatment, y=Distance.Spatial, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Distance.Spatial)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Distance.Spatial, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

# Speed
ggplot(watermazedata, aes(x=Treatment, y=Speed, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Speed)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Speed, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

# Probe stuff
ggplot(watermazedata, aes(x=Treatment, y=Probe.Entries.1, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Probe.Entries.1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Probe.Entries.1, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

ggplot(watermazedata, aes(x=Treatment, y=Probe.Entries.2, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Probe.Entries.2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Probe.Entries.2, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

ggplot(watermazedata, aes(x=Treatment, y=Probe.Entries.3, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Probe.Entries.3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Probe.Entries.3, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

ggplot(watermazedata, aes(x=Treatment, y=Probe.Entries.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Probe.Entries.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Probe.Entries.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

ggplot(watermazedata, aes(x=Treatment, y=Probe.Percent1, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Probe.Percent1)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Probe.Percent1, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

ggplot(watermazedata, aes(x=Treatment, y=Probe.Percent2, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Probe.Percent2)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Probe.Percent2, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

ggplot(watermazedata, aes(x=Treatment, y=Probe.Percent3, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Probe.Percent3)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Probe.Percent3, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

ggplot(watermazedata, aes(x=Treatment, y=Probe.Percent.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Probe.Percent.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Probe.Percent.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

ggplot(watermazedata, aes(x=Treatment, y=Probe2.Opposite.Percent, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Probe2.Opposite.Percent)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Probe2.Opposite.Percent, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

# Working memory stuff
ggplot(watermazedata, aes(x=Treatment, y=Working.Duration.Trial1.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Working.Duration.Trial1.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Working.Duration.Trial1.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

ggplot(watermazedata, aes(x=Treatment, y=Working.Duration.Trial2.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Working.Duration.Trial2.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Working.Duration.Trial2.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

ggplot(watermazedata, aes(x=Treatment, y=Working.Duration.Diff.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Working.Duration.Diff.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Working.Duration.Diff.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

ggplot(watermazedata, aes(x=Treatment, y=Working.Distance.Trial1.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Working.Distance.Trial1.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Working.Distance.Trial1.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

ggplot(watermazedata, aes(x=Treatment, y=Working.Distance.Trial2.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Working.Distance.Trial2.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Working.Distance.Trial2.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

ggplot(watermazedata, aes(x=Treatment, y=Working.Distance.Diff.Ave, fill="white")) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE, alpha=0.6) +
geom_jitter(color="black", size=0.4, alpha=0.9) +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("A boxplot with jitter") +
xlab("")

scttr <- ggplot(watermazedata, aes(x=Treatment, y=Working.Distance.Diff.Ave)) + geom_dotplot(binaxis='y', stackdir='center')
scttr + stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="crossbar", width=0.5, color="red")

ggplot(watermazedata, aes(x=Treatment, y=Working.Distance.Diff.Ave, fill="white")) +
geom_violin() +
scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A") +
theme_ipsum() +
theme(
legend.position="none",
plot.title = element_text(size=11)
) +
ggtitle("Violin chart") +
xlab("")

Meeting assumptions of normality / homogeneity of variance can be tough w/ large data sets because small variations can be “significant” (you can also test homogeneity of variance w/ “variance ratio” or Hartley’s Fmax). Either way, if data are not normally distributed and of equal variances, parametric tests are not valid. To correct “problems” with the data:
Outliers - remove the case / subject (especially if it was somehow “different”) - “bring the case it into the fold” using the mean + 2 or 3 SDs - Change the score to be the mean + 2 or 3 SDs - “bring the case into the fold” using the next highest score plus one method - Change the score to be one unit above the next highest score in the data set
For non-normally-distributed data: - Can also use “trimmed means” (removing a specific % of cases have been removed from each end) - Can also use “M-estimator” which empirically derives the proper % to trim - Can also use bootstrapping to estimate “true” mean / variance - Transform the data: log, square root, or reciprocal transformations can correct for positive skew and/or unequal variance. If data are negatively skewed, you need derive a reciprocal score (reverse the scores by subtracting each score from the highest score obtained) – Make new transformed DVs using newVariable <- function(oldVariable) — Square root: watermazedata\(Duration.Spatial.Sqrt <- sqrt(watermazedata\)Duration.Spatial) — Absolute value: watermazedata\(Duration.Spatial.Abs <- abs(watermazedata\)Duration.Spatial.Diff) — Log (natural): watermazedata\(Duration.Spatial.Log <- log(watermazedata\)Duration.Spatial +1) +1 needed to avoid trying to calculate log of 0 — Log (base 10): watermazedata\(Duration.Spatial.Log10 <- log10(watermazedata\)Duration.Spatial) +1 needed for base 10??? — Reciprocal: watermazedata\(Duration.Spatial.Reciprocal <- 1/(watermazedata\)Duration.Spatial +1) +1 needed to avoid trying to divide by zero
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayAtIEVEQSB3b3JrZmxvdyB0ZW1wbGF0ZSB1c2luZyBOZWxzb24gZGF0YSIKYXV0aG9yOiAiUmljaCBIYXJ0bWFuLCBQaEQiCmRhdGU6ICJEZWNlbWJlciAxOHRoLCAyMDE5IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogIHdvcmRfZG9jdW1lbnQ6IGRlZmF1bHQKLS0tCgppbnN0YWxsIHJlcXVpcmVkIHBhY2thZ2VzIChvbmx5IG5lZWQgdG8gZG8gdGhpcyBvbmNlPykKCmluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKTsgIyBmb3IgZ3JhcGhpY3MgZnVuY3Rpb25zCmluc3RhbGwucGFja2FnZXMoImNhciIpOyAjIGZvciB0aGUgbGV2ZW5lVGVzdCgpIGZ1bmN0aW9uCmluc3RhbGwucGFja2FnZXMoInBhc3RlY3MiKTsgIyBmb3IgdGhlIHN0YXQuZGVzYygpIGZ1bmN0aW9uCmluc3RhbGwucGFja2FnZXMoInBzeWNoIik7ICMgZm9yIHRoZSBkZXNjcmliZSgpIGZ1bmN0aW9uCmluc3RhbGwucGFja2FnZXMoImhyYnJ0aGVtZXMiKQppbnN0YWxsLnBhY2thZ2VzKCJ2aXJpZGlzIikKCiJjYWxsIiB0aGUgcmVxdWlyZWQgcGFja2FnZXMgKG5lZWQgdG8gZG8gdGhpcyBldmVyeSBzZXNzaW9uPykKCmBgYHtyfQpsaWJyYXJ5KGNhcik7IGxpYnJhcnkoZ2dwbG90Mik7IGxpYnJhcnkocGFzdGVjcyk7IGxpYnJhcnkocHN5Y2gpOyBsaWJyYXJ5KGhyYnJ0aGVtZXMpOyBsaWJyYXJ5KHZpcmlkaXMpCmBgYAoKVXNlIEV4Y2VsIHRvIGdlbmVyYXRlIGEgLmNzdiBmaWxlIHdpdGggInRpZHkiIGRhdGEgKGVhY2ggcm93ID0gMSBjYXNlIC8gc3ViamVjdCwgMXN0IHJvdyBpcyBjb2x1bW4gbmFtZXMpLiBJbXBvcnQgLkNTViBmaWxlIGludG8gUiAiZGF0YWZyYW1lIiBjYWxsZWQgIndhdGVybWF6ZWRhdGEiLiBUaGVuIHNob3cgdGhlICJ3YXRlcm1hemVkYXRhIiBkYXRhZnJhbWUgKGhlYWRlciArIDFzdCA4IGRhdGEgcm93cykgdG8gY2hlY2sgaXQgb3V0CgpgYGB7cn0Kd2F0ZXJtYXplZGF0YSA8LSByZWFkLmNzdihmaWxlPSIuL2RhdGFfY2xlYW4vd2F0ZXIgbWF6ZSBhbGwuY3N2IiwgaGVhZGVyPVRSVUUsIHNlcD0iLCIpCndhdGVybWF6ZWRhdGEKYGBgCgpEZXJpdmUgbmV3IHZhcmlhYmxlcy4gTW9zdGx5IHVzZSB0aGUgcm93TWVhbnMoKSBmdW5jdGlvbiwgYnV0IHRoZXNlIG1heSBiZSB1c2VmdWwgYXMgd2VsbC4uLgoKTWFrZSBzb21lIG5ldyBEVnMgKH4iY29sdW1ucyIpIGFzc2lnbmVkIDEgKFRSVUUpIG9yIDAgKEZBTFNFKSBiYXNlZCBvbiBCb29sZWFuIGNhbGN1bGF0aW9uczoKLSBMZXNzIHRoYW4/IHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDJMZXNzVGhhblNwYXRpYWwxIDwtIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIgPCB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyCi0gTGVzcyB0aGFuIG9yIGVxdWFsIHRvPyB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxTGVzc1RoYW5PckVxdWFsVG82MCA8LSB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyIDw9IDYwCi0gRXF1YWwgdG8/IHdhdGVybWF6ZWRhdGEkU2ggPC0gd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQgPT0gIlNoIgotIE5vdCBlcXVhbCB0bz8gd2F0ZXJtYXplZGF0YSROb3RTaCA8LSB3YXRlcm1hemVkYXRhJFRyZWF0bWVudCAhPSAiU2giCgpVc2UgImlmZWxzZSIgdG8gbWF5YmUgcmVwbGFjZSBzY29yZXMgKGUuZy4sIHJlcGxhY2UgYW55IGR1cmF0aW9uIGdyZWF0ZXIgdGhhbiA2MCB3aXRoIE5BICJtaXNzaW5nIGRhdGEiLCBlbHNlIGtlZXAgdGhlIHNhbWUpCi0gd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsLkNsZWFuIDwtIGlmZWxzZSh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwgPiA2MCwgTkEsIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbCkKCmBgYHtyfQojIFRyaWFscyAxLTEwIGZvciBjdWVkLCBzcGF0aWFsIDEsIHNwYXRpYWwgMiBhbmQgc3BhdGlhbCB0cmlhbHMgYXZlcmFnZWQgaW50byA1IGJsb2NrcyAoMiB0cmlhbHMgZWFjaCkgZWFjaCBmb3IgYm90aCBEaXN0YW5jZSBhbmQgRHVyYXRpb24Kd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5DdWVkLkJsb2NrMSA8LSByb3dNZWFucyhjYmluZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXRlcm1hemVkYXRhJER1cmF0aW9uLkN1ZWQuMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZC4yKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCndhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZC5CbG9jazIgPC0gcm93TWVhbnMoY2JpbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5DdWVkLjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJER1cmF0aW9uLkN1ZWQuNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQp3YXRlcm1hemVkYXRhJER1cmF0aW9uLkN1ZWQuQmxvY2szIDwtIHJvd01lYW5zKGNiaW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZC41LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5DdWVkLjYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5DdWVkLkJsb2NrNCA8LSByb3dNZWFucyhjYmluZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXRlcm1hemVkYXRhJER1cmF0aW9uLkN1ZWQuNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZC44KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCndhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZC5CbG9jazUgPC0gcm93TWVhbnMoY2JpbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5DdWVkLjksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJER1cmF0aW9uLkN1ZWQuMTApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKCndhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDEuQmxvY2sxIDwtIHJvd01lYW5zKGNiaW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMS4yKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQp3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLkJsb2NrMiA8LSByb3dNZWFucyhjYmluZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMS4zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDEuNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMS5CbG9jazMgPC0gcm93TWVhbnMoY2JpbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDEuNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLjYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCndhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDEuQmxvY2s0IDwtIHJvd01lYW5zKGNiaW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLjcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMS44KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQp3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLkJsb2NrNSA8LSByb3dNZWFucyhjYmluZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMS45LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDEuMTApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCgp3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyLkJsb2NrMSA8LSByb3dNZWFucyhjYmluZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMi4xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIuMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMi5CbG9jazIgPC0gcm93TWVhbnMoY2JpbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIuMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyLjQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCndhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIuQmxvY2szIDwtIHJvd01lYW5zKGNiaW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyLjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMi42KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQp3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyLkJsb2NrNCA8LSByb3dNZWFucyhjYmluZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMi43LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIuOCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMi5CbG9jazUgPC0gcm93TWVhbnMoY2JpbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIuOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyLjEwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQoKd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMy5CbG9jazEgPC0gcm93TWVhbnMoY2JpbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDMuMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwzLjIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCndhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDMuQmxvY2syIDwtIHJvd01lYW5zKGNiaW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwzLjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMy40KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQp3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwzLkJsb2NrMyA8LSByb3dNZWFucyhjYmluZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMy41LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDMuNiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMy5CbG9jazQgPC0gcm93TWVhbnMoY2JpbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDMuNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwzLjgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCndhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDMuQmxvY2s1IDwtIHJvd01lYW5zKGNiaW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwzLjksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMy4xMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKCndhdGVybWF6ZWRhdGEkRGlzdGFuY2UuQ3VlZC5CbG9jazEgPC0gcm93TWVhbnMoY2JpbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5DdWVkLjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQuMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQp3YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQuQmxvY2syIDwtIHJvd01lYW5zKGNiaW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuQ3VlZC4zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5DdWVkLjQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5DdWVkLkJsb2NrMyA8LSByb3dNZWFucyhjYmluZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQuNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuQ3VlZC42KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCndhdGVybWF6ZWRhdGEkRGlzdGFuY2UuQ3VlZC5CbG9jazQgPC0gcm93TWVhbnMoY2JpbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5DdWVkLjcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQuOCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQp3YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQuQmxvY2s1IDwtIHJvd01lYW5zKGNiaW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuQ3VlZC45LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5DdWVkLjEwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCgp3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwxLkJsb2NrMSA8LSByb3dNZWFucyhjYmluZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMS4xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDEuMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMS5CbG9jazIgPC0gcm93TWVhbnMoY2JpbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDEuMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwxLjQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCndhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDEuQmxvY2szIDwtIHJvd01lYW5zKGNiaW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwxLjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMS42KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQp3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwxLkJsb2NrNCA8LSByb3dNZWFucyhjYmluZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMS43LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDEuOCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMS5CbG9jazUgPC0gcm93TWVhbnMoY2JpbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDEuOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwxLjEwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQoKd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMi5CbG9jazEgPC0gcm93TWVhbnMoY2JpbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIuMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwyLjIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCndhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIuQmxvY2syIDwtIHJvd01lYW5zKGNiaW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwyLjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMi40KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQp3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwyLkJsb2NrMyA8LSByb3dNZWFucyhjYmluZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMi41LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIuNiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMi5CbG9jazQgPC0gcm93TWVhbnMoY2JpbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIuNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwyLjgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCndhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIuQmxvY2s1IDwtIHJvd01lYW5zKGNiaW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwyLjksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMi4xMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKCndhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMuQmxvY2sxIDwtIHJvd01lYW5zKGNiaW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwzLjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMy4yKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQp3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwzLkJsb2NrMiA8LSByb3dNZWFucyhjYmluZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMy4zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMuNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMy5CbG9jazMgPC0gcm93TWVhbnMoY2JpbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMuNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwzLjYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCndhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMuQmxvY2s0IDwtIHJvd01lYW5zKGNiaW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwzLjcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMy44KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQp3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwzLkJsb2NrNSA8LSByb3dNZWFucyhjYmluZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMy45LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMuMTApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCgojIEN1ZWQsIHNwYXRpYWwgMSwgc3BhdGlhbCAyIGFuZCBzcGF0aWFsIGJsb2NrcyAxLTUgYXZlcmFnZWQgaW50byBPdmVyYWxsIEF2ZXJhZ2VzIGZvciBib3RoIERpc3RhbmNlIGFuZCBEdXJhdGlvbgp3YXRlcm1hemVkYXRhJER1cmF0aW9uLkN1ZWQgPC0gcm93TWVhbnMoY2JpbmQgKHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZC4xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZC4yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZC4zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZC40LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZC41KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMSA8LSByb3dNZWFucyhjYmluZCAod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMS4xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDEuMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMS40LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLjUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMiA8LSByb3dNZWFucyhjYmluZCAod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMi4xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyLjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIuMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMi40LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyLjUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMyA8LSByb3dNZWFucyhjYmluZCAod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMy4xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwzLjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDMuMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMy40LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwzLjUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsIDwtIHJvd01lYW5zKGNiaW5kICh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCgoKd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5DdWVkIDwtIHJvd01lYW5zKGNiaW5kICh3YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQuMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQuMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQuMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQuNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQuNSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCndhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDEgPC0gcm93TWVhbnMoY2JpbmQgKHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDEuMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMS4yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwxLjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDEuNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMS41KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCndhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIgPC0gcm93TWVhbnMoY2JpbmQgKHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIuMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMi4yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwyLjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIuNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMi41KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCndhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMgPC0gcm93TWVhbnMoY2JpbmQgKHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMuMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMy4yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwzLjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMuNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMy41KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCndhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbCA8LSByb3dNZWFucyhjYmluZCAod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQoKIyBNYWtlIGEgU3BlZWQgdmFyaWFibGUgKERpc3RhbmNlL0R1cmF0aW9uKQp3YXRlcm1hemVkYXRhJFNwZWVkIDwtIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbCAvIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbAoKIyBNYWtlIHdvcmtpbmcgbWVtb3J5IHZhcmlhYmxlcwp3YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uVHJpYWwxLjEgPC0gd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMS4xCndhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuMSA8LSB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLjIKd2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLkRpZmYuMSA8LSB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLjEgLSB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLjIKCndhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDEuMiA8LSB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyLjEKd2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMi4yIDwtIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIuMgp3YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uRGlmZi4yIDwtIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIuMSAtIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIuMgoKd2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMS4zIDwtIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDMuMQp3YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uVHJpYWwyLjMgPC0gd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMy4yCndhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5EaWZmLjMgPC0gd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMy4xIC0gd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMy4yCgp3YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uVHJpYWwxLkF2ZSA8LSAod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMS4xICsgd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMi4xICsgd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMy4xKSAvIDMKd2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMi5BdmUgPC0gKHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDEuMiArIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIuMiArIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDMuMikgLyAzCndhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSA8LSAod2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLkRpZmYuMSArIHdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5EaWZmLjIgKyB3YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uRGlmZi4zKSAvIDMKCgp3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLjEgPC0gd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMS4xCndhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5UcmlhbDIuMSA8LSB3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwxLjIKd2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLkRpZmYuMSA8LSB3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwxLjEgLSB3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwxLjIKCndhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5UcmlhbDEuMiA8LSB3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwyLjEKd2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLlRyaWFsMi4yIDwtIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIuMgp3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuRGlmZi4yIDwtIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIuMSAtIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIuMgoKd2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLlRyaWFsMS4zIDwtIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMuMQp3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLjMgPC0gd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMy4yCndhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5EaWZmLjMgPC0gd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMy4xIC0gd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMy4yCgp3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSA8LSAod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMS4xICsgd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMi4xICsgd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMy4xKSAvIDMKd2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUgPC0gKHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDEuMiArIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIuMiArIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMuMikgLyAzCndhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSA8LSAod2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLkRpZmYuMSArIHdhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5EaWZmLjIgKyB3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuRGlmZi4zKSAvIDMKCmBgYAoKQ3JlYXRlIGEgInN1YnNldCIgZGF0YWZyYW1lIGZvciBlYWNoIGdyb3VwIHRvIGVhc2UgbWFraW5nIGhpc3RvZ3JhbXMvbm9ybWFsIGN1cnZlcyBhbmQgUVEgcGxvdHMgYnkgZ3JvdXAuCgpgYGB7cn0KQWNfd2F0ZXJtYXplZGF0YTwtc3Vic2V0KHdhdGVybWF6ZWRhdGEsIHdhdGVybWF6ZWRhdGEkVHJlYXRtZW50PT0iQWMiKQpGeF93YXRlcm1hemVkYXRhPC1zdWJzZXQod2F0ZXJtYXplZGF0YSwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQ9PSJGeCIpClNoX3dhdGVybWF6ZWRhdGE8LXN1YnNldCh3YXRlcm1hemVkYXRhLCB3YXRlcm1hemVkYXRhJFRyZWF0bWVudD09IlNoIikKYGBgCgpIb3cgbWFueSBzdWJqZWN0cyBhcmUgbWlzc2luZyBkYXRhIGZyb20gYSBzcGVjaWZpYyBjb2x1bW4/IChuYSA9ICdtaXNzaW5nJykuIE1ha2UgYSB2YXJpYWJsZSB0aGF0IHJldHVybnMgMSAoVFJVRSkgaWYgZGF0YSBpcyBtaXNzaW5nOgp3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLk1pc3NpbmcgPC0gaXMubmEod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMSkKCkhvdyBtYW55IHN1YmplY3RzIGFyZSBtaXNzaW5nIGZyb20gRHVyYXRpb24uU3BhdGlhbDEgZGF0YT8Kc3VtKHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDEuTWlzc2luZykKCjEgPSBtaXNzaW5nLCAwID0gdGhlcmUsIHNvIG1lYW4gd2lsbCB0ZWxsIHVzIHByb3BvcnRpb24gb2YgY2FzZXMgbWlzc2luZyBkYXRhIGluIHRoYXQgdmFyaWFibGUKCi4uLi5vciBzaW1wbHkgY2FsY3VsYXRlIHRoaXMgV0lUSE9VVCBtYWtpbmcgYSBuZXcgdmFyaWFibGU6CgpgYGB7cn0Kc3VtKGlzLm5hKHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZCkpOyBtZWFuKGlzLm5hKHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZCkpCnN1bShpcy5uYSh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxKSk7IG1lYW4oaXMubmEod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMSkpCnN1bShpcy5uYSh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyKSk7IG1lYW4oaXMubmEod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMikpCnN1bShpcy5uYSh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwzKSk7IG1lYW4oaXMubmEod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMykpCnN1bShpcy5uYSh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwpKTsgbWVhbihpcy5uYSh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwpKQoKc3VtKGlzLm5hKHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuQ3VlZCkpOyBtZWFuKGlzLm5hKHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuQ3VlZCkpCnN1bShpcy5uYSh3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwxKSk7IG1lYW4oaXMubmEod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMSkpCnN1bShpcy5uYSh3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwyKSk7IG1lYW4oaXMubmEod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMikpCnN1bShpcy5uYSh3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwzKSk7IG1lYW4oaXMubmEod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMykpCnN1bShpcy5uYSh3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwpKTsgbWVhbihpcy5uYSh3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwpKQoKc3VtKGlzLm5hKHdhdGVybWF6ZWRhdGEkU3BlZWQpKTsgbWVhbihpcy5uYSh3YXRlcm1hemVkYXRhJFNwZWVkKSkKCnN1bShpcy5uYSh3YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMSkpOyBtZWFuKGlzLm5hKHdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4xKSkKc3VtKGlzLm5hKHdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4yKSk7IG1lYW4oaXMubmEod2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjIpKQpzdW0oaXMubmEod2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjMpKTsgbWVhbihpcy5uYSh3YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMykpCnN1bShpcy5uYSh3YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuQXZlKSk7IG1lYW4oaXMubmEod2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLkF2ZSkpCnN1bShpcy5uYSh3YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQxKSk7IG1lYW4oaXMubmEod2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MSkpCnN1bShpcy5uYSh3YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQyKSk7IG1lYW4oaXMubmEod2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MikpCnN1bShpcy5uYSh3YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQzKSk7IG1lYW4oaXMubmEod2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MykpCnN1bShpcy5uYSh3YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQuQXZlKSk7IG1lYW4oaXMubmEod2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50LkF2ZSkpCnN1bShpcy5uYSh3YXRlcm1hemVkYXRhJFByb2JlMi5PcHBvc2l0ZS5QZXJjZW50KSk7IG1lYW4oaXMubmEod2F0ZXJtYXplZGF0YSRQcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCkpCgpzdW0oaXMubmEod2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUpKTsgbWVhbihpcy5uYSh3YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uVHJpYWwxLkF2ZSkpCnN1bShpcy5uYSh3YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uVHJpYWwyLkF2ZSkpOyBtZWFuKGlzLm5hKHdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlKSkKc3VtKGlzLm5hKHdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSkpOyBtZWFuKGlzLm5hKHdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSkpCgpzdW0oaXMubmEod2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLlRyaWFsMS5BdmUpKTsgbWVhbihpcy5uYSh3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSkpCnN1bShpcy5uYSh3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSkpOyBtZWFuKGlzLm5hKHdhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5UcmlhbDIuQXZlKSkKc3VtKGlzLm5hKHdhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSkpOyBtZWFuKGlzLm5hKHdhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSkpCmBgYAoKTm93LCBzdGFydCBjaGVja2luZyB0aGUgdmFyaW91cyBhdXNzdW1wdGlvbnMgKG5vcm1hbGl0eSwgaG9tb2dlbmVpdHkgb2YgdmFyaWFuY2UsIGV0Yy4pIGZvciBhbGwgKm1lYW5pbmdmdWwgRFZTKiAtIGUuZy4sIEF2ZXJhZ2UgRGlzdGFuY2UgYW5kIERpc3RhbmNlIGZvciBkYXlzIDEtMyBhcmUgcHJvYmFibHkgaW1wb3J0YW50LCBidXQgQmxvY2tzIDEtNSBmcm9tIGVhY2ggYXJlICpwcm9iYWJseSogbm90ICg/KS4gSWYgdGhlIGlkZWEgaXMgdG8gY29tcGFyZSBncm91cHMsIHRoZSBhc3N1bXB0aW9ucyBuZWVkIHRvIGJlIHRlc3RlZCB3aXRoIGVhY2ggdmFyaWFibGUgYnJva2VuIGRvd24gYnkgZ3JvdXAuCgo/Pz8gaXMgdGhlcmUgYSAiQm9uZmVycm9uaSBjb3JyZWN0aW9uIiBmb3IgbXVsdGlwbGUgdGVzdHMgb2YgTm9ybWFsaXR5IGV0YyA/Pz8KCkdlbmVyYXRlIHNvbWUgZGVzY3JpcHRpdmUgc3RhdHMgZm9yIHRoZSB2YXJpYWJsZXMgb2YgaW50ZXJlc3QuCgpOT1RFOiBGb3Igb3V0cHV0IHJlcG9ydGVkIHVzaW5nICJlIjogZSswMiwgc2ltcGx5ICJtb3ZlIiB0aGUgZGVjaW1hbCBwb2ludCAyIHBsYWNlcyB0byByaWdodC4gZS0wMiA9IG1vdmUgZGVjaW1hbCAyIHBsYWNlcyB0byBsZWZ0Li4uCgpDYW4gdXNlIGRlc2NyaWJlKCkgKGZyb20gdGhlIHBzeWNoIHBhY2thZ2UpIG9yIHN0YXQuZGVzYygpIGZ1bmN0aW9uIChmcm9tIHRoZSBwYXN0ZWNzIHBhY2thZ2UpIHRvIGdldCBzb21lIGJhc2ljIHN0YXRzLgoKYGBge3J9CiMgZGVzY3JpYmUoKQojIE92ZXJhbGwgRFZzIChub3QgYnJva2VuIGRvd24gYnkgZ3JvdXApCiMgc2luZ2xlIHZhcmlhYmxlczogYnkoZGF0YSA9IGRhdGFGcmFtZSRWYXJpYWJsZSwgSU5ESUNFUyA9IGRhdGFGcmFtZSRncm91cGluZyBEViwgRlVOID0gZnVuY3Rpb24pCiMgYnkoZGF0YSA9IHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbCwgSU5ESUNFUyA9IHdhdGVybWF6ZWRhdGEkVHJlYXRtZW50LCBGVU4gPSBkZXNjcmliZSkKIyBvcgojIGJ5KHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbCwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQsIGRlc2NyaWJlKQojIG11bHRpcGxlIHZhcmlhYmxlcyBhdCBvbmNlOgojIGRlc2NyaWJlKGNiaW5kKHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZCwKIyAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLAojICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIsCiMgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMywKIyAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwsCiMgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5DdWVkLAojICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDEsCiMgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMiwKIyAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwzLAojICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbCwKIyAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJFNwZWVkLAojICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4xLAojICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4yLAojICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4zLAojICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy5BdmUsCiMgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MSwKIyAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQyLAojICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDMsCiMgICAgICAgICAgICAgICAgd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50LkF2ZSwKIyAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJFByb2JlMi5PcHBvc2l0ZS5QZXJjZW50LAojICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlLAojICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlLAojICAgICAgICAgICAgICAgIHdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSwKIyAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSwKIyAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSwKIyAgICAgICAgICAgICAgICB3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUpKQojIG9yCiMgZGVzY3JpYmUod2F0ZXJtYXplZGF0YVssYygiRHVyYXRpb24uU3BhdGlhbDEiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAiRHVyYXRpb24uU3BhdGlhbDIiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAiRHVyYXRpb24uU3BhdGlhbDMiKV0pOyAjIEVUQwoKIyBicm9rZW4gZG93biBieSBncm91cAojYnkoY2JpbmQoRHVyYXRpb24uQ3VlZD13YXRlcm1hemVkYXRhJER1cmF0aW9uLkN1ZWQsCiMgICAgICAgICBEdXJhdGlvbi5TcGF0aWFsMT13YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLAojICAgICAgICAgRHVyYXRpb24uU3BhdGlhbDI9d2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMiwKIyAgICAgICAgIER1cmF0aW9uLlNwYXRpYWwzPXdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDMsCiMgICAgICAgICBEdXJhdGlvbi5TcGF0aWFsPXdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbCwKIyAgICAgICAgIERpc3RhbmNlLkN1ZWQ9d2F0ZXJtYXplZGF0YSREaXN0YW5jZS5DdWVkLAojICAgICAgICAgRGlzdGFuY2UuU3BhdGlhbDE9d2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMSwKIyAgICAgICAgIERpc3RhbmNlLlNwYXRpYWwyPXdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIsCiMgICAgICAgICBEaXN0YW5jZS5TcGF0aWFsMz13YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwzLAojICAgICAgICAgRGlzdGFuY2UuU3BhdGlhbD13YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwsCiMgICAgICAgICBTcGVlZD13YXRlcm1hemVkYXRhJFNwZWVkLAojICAgICAgICAgUHJvYmUuRW50cmllcy4xPXdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4xLAojICAgICAgICAgUHJvYmUuRW50cmllcy4yPXdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4yLAojICAgICAgICAgUHJvYmUuRW50cmllcy4zPXdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4zLAojICAgICAgICAgUHJvYmUuRW50cmllcy5BdmU9d2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLkF2ZSwKIyAgICAgICAgIFByb2JlLlBlcmNlbnQxPXdhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDEsCiMgICAgICAgICBQcm9iZS5QZXJjZW50Mj13YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQyLAojICAgICAgICAgUHJvYmUuUGVyY2VudDM9d2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MywKIyAgICAgICAgIFByb2JlLlBlcmNlbnQuQXZlPXdhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudC5BdmUsCiMgICAgICAgICBQcm9iZTIuT3Bwb3NpdGUuUGVyY2VudD13YXRlcm1hemVkYXRhJFByb2JlMi5PcHBvc2l0ZS5QZXJjZW50LAojICAgICAgICAgV29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlPXdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlLAojICAgICAgICAgV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlPXdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlLAojICAgICAgICAgV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZT13YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUsCiMgICAgICAgICBXb3JraW5nLkRpc3RhbmNlLlRyaWFsMS5BdmU9d2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLlRyaWFsMS5BdmUsCiMgICAgICAgICBXb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmU9d2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUsCiMgICAgICAgICBXb3JraW5nLkRpc3RhbmNlLkRpZmYuQXZlPXdhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSksCiMgICB3YXRlcm1hemVkYXRhJFRyZWF0bWVudCwgZGVzY3JpYmUpCgojIG5vcm1hbGl0eSBvZiBvdmVyYWxsIHZhcmlhYmxlcwojIHNoYXBpcm8udGVzdCh3YXRlcm1hemVkYXRhJER1cmF0aW9uLkN1ZWQpCiMgc2hhcGlyby50ZXN0KHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDEpCiMgc2hhcGlyby50ZXN0KHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIpCiMgc2hhcGlyby50ZXN0KHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDMpCiMgc2hhcGlyby50ZXN0KHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbCkKIyBzaGFwaXJvLnRlc3Qod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5DdWVkKQojIHNoYXBpcm8udGVzdCh3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwxKQojIHNoYXBpcm8udGVzdCh3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwyKQojIHNoYXBpcm8udGVzdCh3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwzKQojIHNoYXBpcm8udGVzdCh3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwpCiMgc2hhcGlyby50ZXN0KHdhdGVybWF6ZWRhdGEkU3BlZWQpCiMgc2hhcGlyby50ZXN0KHdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4xKQojIHNoYXBpcm8udGVzdCh3YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMikKIyBzaGFwaXJvLnRlc3Qod2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjMpCiMgc2hhcGlyby50ZXN0KHdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy5BdmUpCiMgc2hhcGlyby50ZXN0KHdhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDEpCiMgc2hhcGlyby50ZXN0KHdhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDIpCiMgc2hhcGlyby50ZXN0KHdhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDMpCiMgc2hhcGlyby50ZXN0KHdhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudC5BdmUpCiMgc2hhcGlyby50ZXN0KHdhdGVybWF6ZWRhdGEkUHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQpCiMgc2hhcGlyby50ZXN0KHdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlKQojIHNoYXBpcm8udGVzdCh3YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uVHJpYWwyLkF2ZSkKIyBzaGFwaXJvLnRlc3Qod2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLkRpZmYuQXZlKQojIHNoYXBpcm8udGVzdCh3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSkKIyBzaGFwaXJvLnRlc3Qod2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUpCiMgc2hhcGlyby50ZXN0KHdhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSkKCiMgbm9ybWFsaXR5IG9mIHZhcmlhYmxlcyBicm9rZW4gZG93biBieSBncm91cAojIGJ5KHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZCwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQsIHNoYXBpcm8udGVzdCkKIyBieSh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLCB3YXRlcm1hemVkYXRhJFRyZWF0bWVudCwgc2hhcGlyby50ZXN0KQojIGJ5KHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIsIHdhdGVybWF6ZWRhdGEkVHJlYXRtZW50LCBzaGFwaXJvLnRlc3QpCiMgYnkod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMywgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQsIHNoYXBpcm8udGVzdCkKIyBieSh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwsIHdhdGVybWF6ZWRhdGEkVHJlYXRtZW50LCBzaGFwaXJvLnRlc3QpCiMgYnkod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5DdWVkLCB3YXRlcm1hemVkYXRhJFRyZWF0bWVudCwgc2hhcGlyby50ZXN0KQojIGJ5KHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDEsIHdhdGVybWF6ZWRhdGEkVHJlYXRtZW50LCBzaGFwaXJvLnRlc3QpCiMgYnkod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMiwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQsIHNoYXBpcm8udGVzdCkKIyBieSh3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwzLCB3YXRlcm1hemVkYXRhJFRyZWF0bWVudCwgc2hhcGlyby50ZXN0KQojIGJ5KHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbCwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQsIHNoYXBpcm8udGVzdCkKIyBieSh3YXRlcm1hemVkYXRhJFNwZWVkLCB3YXRlcm1hemVkYXRhJFRyZWF0bWVudCwgc2hhcGlyby50ZXN0KQojIGJ5KHdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4xLCB3YXRlcm1hemVkYXRhJFRyZWF0bWVudCwgc2hhcGlyby50ZXN0KQojIGJ5KHdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4yLCB3YXRlcm1hemVkYXRhJFRyZWF0bWVudCwgc2hhcGlyby50ZXN0KQojIGJ5KHdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4zLCB3YXRlcm1hemVkYXRhJFRyZWF0bWVudCwgc2hhcGlyby50ZXN0KQojIGJ5KHdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy5BdmUsIHdhdGVybWF6ZWRhdGEkVHJlYXRtZW50LCBzaGFwaXJvLnRlc3QpCiMgYnkod2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MSwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQsIHNoYXBpcm8udGVzdCkKIyBieSh3YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQyLCB3YXRlcm1hemVkYXRhJFRyZWF0bWVudCwgc2hhcGlyby50ZXN0KQojIGJ5KHdhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDMsIHdhdGVybWF6ZWRhdGEkVHJlYXRtZW50LCBzaGFwaXJvLnRlc3QpCiMgYnkod2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50LkF2ZSwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQsIHNoYXBpcm8udGVzdCkKIyBieSh3YXRlcm1hemVkYXRhJFByb2JlMi5PcHBvc2l0ZS5QZXJjZW50LCB3YXRlcm1hemVkYXRhJFRyZWF0bWVudCwgc2hhcGlyby50ZXN0KQojIGJ5KHdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlLCB3YXRlcm1hemVkYXRhJFRyZWF0bWVudCwgc2hhcGlyby50ZXN0KQojIGJ5KHdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlLCB3YXRlcm1hemVkYXRhJFRyZWF0bWVudCwgc2hhcGlyby50ZXN0KQojIGJ5KHdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQsIHNoYXBpcm8udGVzdCkKIyBieSh3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQsIHNoYXBpcm8udGVzdCkKIyBieSh3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQsIHNoYXBpcm8udGVzdCkKIyBieSh3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUsIHdhdGVybWF6ZWRhdGEkVHJlYXRtZW50LCBzaGFwaXJvLnRlc3QpCmBgYAoKVXNpbmcgc3RhdC5kZXNjCgpgYGB7cn0KCiMgc3RhdC5kZXNjKCkKIyB1c2luZyBiYXNpYyA9IEZBTFNFIGFkZHMgU2hhcGlyby1XaWxrcyB0ZXN0LCBuZWdhdGluZyB0aGUgbmVlZCB0byBydW4gdGhhdCBzZXBhcmF0ZWx5IGFzIHdpdGggZGVzY3JpYmUoKQojIE92ZXJhbGwgRFZzIChub3QgYnJva2VuIGRvd24gYnkgZ3JvdXApCnN0YXQuZGVzYyhjYmluZChEdXJhdGlvbi5DdWVkPXdhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZCwKICAgICAgICAgICAgICAgIER1cmF0aW9uLlNwYXRpYWwxPXdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDEsCiAgICAgICAgICAgICAgICBEdXJhdGlvbi5TcGF0aWFsMj13YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyLAogICAgICAgICAgICAgICAgRHVyYXRpb24uU3BhdGlhbDM9d2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMywKICAgICAgICAgICAgICAgIER1cmF0aW9uLlNwYXRpYWw9d2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsLAogICAgICAgICAgICAgICAgRGlzdGFuY2UuQ3VlZD13YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQsCiAgICAgICAgICAgICAgICBEaXN0YW5jZS5TcGF0aWFsMT13YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwxLAogICAgICAgICAgICAgICAgRGlzdGFuY2UuU3BhdGlhbDI9d2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMiwKICAgICAgICAgICAgICAgIERpc3RhbmNlLlNwYXRpYWwzPXdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMsCiAgICAgICAgICAgICAgICBEaXN0YW5jZS5TcGF0aWFsPXdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbCwKICAgICAgICAgICAgICAgIFNwZWVkPXdhdGVybWF6ZWRhdGEkU3BlZWQsCiAgICAgICAgICAgICAgICBQcm9iZS5FbnRyaWVzLjE9d2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjEsCiAgICAgICAgICAgICAgICBQcm9iZS5FbnRyaWVzLjI9d2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjIsCiAgICAgICAgICAgICAgICBQcm9iZS5FbnRyaWVzLjM9d2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjMsCiAgICAgICAgICAgICAgICBQcm9iZS5FbnRyaWVzLkF2ZT13YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuQXZlLAogICAgICAgICAgICAgICAgUHJvYmUuUGVyY2VudDE9d2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MSwKICAgICAgICAgICAgICAgIFByb2JlLlBlcmNlbnQyPXdhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDIsCiAgICAgICAgICAgICAgICBQcm9iZS5QZXJjZW50Mz13YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQzLAogICAgICAgICAgICAgICAgUHJvYmUuUGVyY2VudC5BdmU9d2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50LkF2ZSwKICAgICAgICAgICAgICAgIFByb2JlMi5PcHBvc2l0ZS5QZXJjZW50PXdhdGVybWF6ZWRhdGEkUHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQsCiAgICAgICAgICAgICAgICBXb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmU9d2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUsCiAgICAgICAgICAgICAgICBXb3JraW5nLkR1cmF0aW9uLlRyaWFsMi5BdmU9d2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMi5BdmUsCiAgICAgICAgICAgICAgICBXb3JraW5nLkR1cmF0aW9uLkRpZmYuQXZlPXdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSwKICAgICAgICAgICAgICAgIFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZT13YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSwKICAgICAgICAgICAgICAgIFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZT13YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSwKICAgICAgICAgICAgICAgIFdvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmU9d2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLkRpZmYuQXZlKSwKICAgICAgICAgIGJhc2ljID0gRkFMU0UsIG5vcm0gPSBUUlVFKQojIG9yCiMgc3RhdC5kZXNjKHdhdGVybWF6ZWRhdGFbLCBjKCJEdXJhdGlvbi5TcGF0aWFsMSIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkR1cmF0aW9uLlNwYXRpYWwyIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHVyYXRpb24uU3BhdGlhbDMiKV0sIGJhc2ljID0gRkFMU0UsIG5vcm0gPSBUUlVFKTsgIyBFVEMKCiMgQnJva2VuIGRvd24gYnkgZ3JvdXAKIyBzaW5nbGUgdmFyaWFibGVzOiBieShkYXRhID0gZGF0YUZyYW1lJFZhcmlhYmxlLCBJTkRJQ0VTID0gZGF0YUZyYW1lJGdyb3VwaW5nIERWLCBGVU4gPSBmdW5jdGlvbikKIyBieShkYXRhID0gd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsLCBJTkRJQ0VTID0gd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQsIEZVTiA9IHN0YXQuZGVzYykKIyBvcgojIGJ5KHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbCwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQsIHN0YXQuZGVzYykKIyBvcgojIGJ5KHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbCwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQsIHN0YXQuZGVzYywgYmFzaWMgPSBGQUxTRSwgbm9ybSA9IFRSVUUpCiMgbXVsdGlwbGUgdmFyaWFibGVzIGF0IG9uY2U6CmJ5KGNiaW5kKER1cmF0aW9uLkN1ZWQ9d2F0ZXJtYXplZGF0YSREdXJhdGlvbi5DdWVkLAogICAgICAgICBEdXJhdGlvbi5TcGF0aWFsMT13YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLAogICAgICAgICBEdXJhdGlvbi5TcGF0aWFsMj13YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyLAogICAgICAgICBEdXJhdGlvbi5TcGF0aWFsMz13YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwzLAogICAgICAgICBEdXJhdGlvbi5TcGF0aWFsPXdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbCwKICAgICAgICAgRGlzdGFuY2UuQ3VlZD13YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQsCiAgICAgICAgIERpc3RhbmNlLlNwYXRpYWwxPXdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDEsCiAgICAgICAgIERpc3RhbmNlLlNwYXRpYWwyPXdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIsCiAgICAgICAgIERpc3RhbmNlLlNwYXRpYWwzPXdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMsCiAgICAgICAgIERpc3RhbmNlLlNwYXRpYWw9d2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsLAogICAgICAgICBTcGVlZD13YXRlcm1hemVkYXRhJFNwZWVkLAogICAgICAgICBQcm9iZS5FbnRyaWVzLjE9d2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjEsCiAgICAgICAgIFByb2JlLkVudHJpZXMuMj13YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMiwKICAgICAgICAgUHJvYmUuRW50cmllcy4zPXdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4zLAogICAgICAgICBQcm9iZS5FbnRyaWVzLkF2ZT13YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuQXZlLAogICAgICAgICBQcm9iZS5QZXJjZW50MT13YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQxLAogICAgICAgICBQcm9iZS5QZXJjZW50Mj13YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQyLAogICAgICAgICBQcm9iZS5QZXJjZW50Mz13YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQzLAogICAgICAgICBQcm9iZS5QZXJjZW50LkF2ZT13YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQuQXZlLAogICAgICAgICBQcm9iZTIuT3Bwb3NpdGUuUGVyY2VudD13YXRlcm1hemVkYXRhJFByb2JlMi5PcHBvc2l0ZS5QZXJjZW50KSwKICAgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQsIHN0YXQuZGVzYywgYmFzaWMgPSBGQUxTRSwgbm9ybSA9IFRSVUUpCiMgb3IKIyBieSh3YXRlcm1hemVkYXRhWywgYygiRHVyYXRpb24uU3BhdGlhbDEiLAojICAgICAgICAgICAgICAgICAgICAgIkR1cmF0aW9uLlNwYXRpYWwxIiwKIyAgICAgICAgICAgICAgICAgICAgICJEdXJhdGlvbi5TcGF0aWFsMyIpXSw7ICNFVEMKIyAgIHdhdGVybWF6ZWRhdGEkVHJlYXRtZW50LCBzdGF0LmRlc2MsIGJhc2ljID0gRkFMU0UsIG5vcm0gPSBUUlVFKQoKYGBgCgpUZXN0IGZvciBob21vZ2VuZWl0eSBvZiB2YXJpYW5jZSBhbW9uZyBncm91cHMgdXNpbmcgdGhlIGxldmVuZVRlc3QoKSBmdW5jdGlvbiBmcm9tIHRoZSBjYXIgcGFja2FnZSAoZGVmYXVsdCB1c2VzIG1lZGlhbikuLi4gdG8gdXNlIG1lYW4gaW5zdGVhZCBvZiBtZWRpYW4gLSBmb3IgZXhhbXBsZToKbGV2ZW5lVGVzdCh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwsIHdhdGVybWF6ZWRhdGEkVHJlYXRtZW50LCBjZW50ZXIgPSBtZWFuKQoKYGBge3J9CgpsZXZlbmVUZXN0KHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZCwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQpCmxldmVuZVRlc3Qod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMSwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQpCmxldmVuZVRlc3Qod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMiwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQpCmxldmVuZVRlc3Qod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMywgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQpCmxldmVuZVRlc3Qod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsLCB3YXRlcm1hemVkYXRhJFRyZWF0bWVudCkKbGV2ZW5lVGVzdCh3YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQsIHdhdGVybWF6ZWRhdGEkVHJlYXRtZW50KQpsZXZlbmVUZXN0KHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDEsIHdhdGVybWF6ZWRhdGEkVHJlYXRtZW50KQpsZXZlbmVUZXN0KHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIsIHdhdGVybWF6ZWRhdGEkVHJlYXRtZW50KQpsZXZlbmVUZXN0KHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMsIHdhdGVybWF6ZWRhdGEkVHJlYXRtZW50KQpsZXZlbmVUZXN0KHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbCwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQpCmxldmVuZVRlc3Qod2F0ZXJtYXplZGF0YSRTcGVlZCwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQpCmxldmVuZVRlc3Qod2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjEsIHdhdGVybWF6ZWRhdGEkVHJlYXRtZW50KQpsZXZlbmVUZXN0KHdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4yLCB3YXRlcm1hemVkYXRhJFRyZWF0bWVudCkKbGV2ZW5lVGVzdCh3YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMywgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQpCmxldmVuZVRlc3Qod2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLkF2ZSwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQpCmxldmVuZVRlc3Qod2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MSwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQpCmxldmVuZVRlc3Qod2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50Miwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQpCmxldmVuZVRlc3Qod2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50Mywgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQpCmxldmVuZVRlc3Qod2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50LkF2ZSwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQpCmxldmVuZVRlc3Qod2F0ZXJtYXplZGF0YSRQcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQpCmxldmVuZVRlc3Qod2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUsIHdhdGVybWF6ZWRhdGEkVHJlYXRtZW50KQpsZXZlbmVUZXN0KHdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlLCB3YXRlcm1hemVkYXRhJFRyZWF0bWVudCkKbGV2ZW5lVGVzdCh3YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUsIHdhdGVybWF6ZWRhdGEkVHJlYXRtZW50KQpsZXZlbmVUZXN0KHdhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5UcmlhbDEuQXZlLCB3YXRlcm1hemVkYXRhJFRyZWF0bWVudCkKbGV2ZW5lVGVzdCh3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSwgd2F0ZXJtYXplZGF0YSRUcmVhdG1lbnQpCmxldmVuZVRlc3Qod2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLkRpZmYuQXZlLCB3YXRlcm1hemVkYXRhJFRyZWF0bWVudCkKCiMgKioqIElGIDEgT0YgMyBJUyBTSUdOSUZJQ0FOVCBbTk9UIE5PUk1BTF0sIERPRVMgVEhBVCBSRVFVSVJFIE5PTlBBUkFNRVRSSUM/ICoqKgpgYGAKClZpc3VhbGx5IGNoZWNrIGVhY2ggdmFyaWFibGUncyBkYXRhIGZvciBub3JtYWxpdHkgLyBvdXRsaWVycyBhdmVyYWdlZCBhY3Jvc3MgYWxsIGdyb3Vwcy4gVGhpcyBpbmZvIGlzIHByb2JhYmx5IG5vdCBhbGwgdGhhdCBpbnRlcmVzdG5nIHVudGlsIGJyb2tlbiBkb3duIGJ5IGdyb3VwLgotIEhpc3RvZ3JhbXMgdy8gb3ZlcmxhaWQgbm9ybWFsIGN1cnZlcwotIFF1YW50aWxl4oCTcXVhbnRpbGUgKFFRKSBwbG90cwotIEJveHBsb3RzCi0gU2NhdHRlcnBsb3RzCi0gVmlvbGluIHBsb3RzCgpgYGB7cn0KIyBIaXN0b2dyYW1zIHdpdGggb3ZlcmxhaWQgbm9ybWFsIGN1cnZlIGFuZCBRdWFudGlsZeKAk3F1YW50aWxlIHBsb3RzCiMgU2NhdHRlcnBsb3RzOgojIHAgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1TcGVlZCkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKIyB1c2UgZ2VvbV9jcm9zc2JhcigpCiMgcCArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQojIFVzZSBnZW9tX2Vycm9yYmFyKCkKIyBwICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPW1lYW5fc2RsLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iZXJyb3JiYXIiLCBjb2xvcj0icmVkIiwgd2lkdGg9MC4yKSArIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLCBnZW9tPSJwb2ludCIsIGNvbG9yPSJyZWQiKQojIFVzZSBnZW9tX3BvaW50cmFuZ2UoKQojIHAgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9bWVhbl9zZGwsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJwb2ludHJhbmdlIiwgY29sb3I9InJlZCIpCgojIER1cmF0aW9uCgpoaXN0LkR1cmF0aW9uLkN1ZWQgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyhEdXJhdGlvbi5DdWVkKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiQXZlcmFnZSBDdWVkIER1cmF0aW9uIiwgeSA9ICJOdW1iZXIiKQpoaXN0LkR1cmF0aW9uLkN1ZWQgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4od2F0ZXJtYXplZGF0YSREdXJhdGlvbi5DdWVkLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZCwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LkR1cmF0aW9uLkN1ZWQgPC0gcXBsb3Qoc2FtcGxlID0gd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5DdWVkKQpxcXBsb3QuRHVyYXRpb24uQ3VlZApib3hwbG90KHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZCwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkR1cmF0aW9uIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9RHVyYXRpb24uQ3VlZCwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1EdXJhdGlvbi5DdWVkKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1EdXJhdGlvbi5DdWVkLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5EdXJhdGlvbi5TcGF0aWFsMSA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKER1cmF0aW9uLlNwYXRpYWwxKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiQXZlcmFnZSBTcGF0aWFsIER1cmF0aW9uIiwgeSA9ICJOdW1iZXIiKQpoaXN0LkR1cmF0aW9uLlNwYXRpYWwxICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDEsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2Qod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMSwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LkR1cmF0aW9uLlNwYXRpYWwxIDwtIHFwbG90KHNhbXBsZSA9IHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDEpCnFxcGxvdC5EdXJhdGlvbi5TcGF0aWFsMQpib3hwbG90KHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDEsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEdXJhdGlvbiIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PUR1cmF0aW9uLlNwYXRpYWwxLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PUR1cmF0aW9uLlNwYXRpYWwxKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1EdXJhdGlvbi5TcGF0aWFsMSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuRHVyYXRpb24uU3BhdGlhbDIgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyhEdXJhdGlvbi5TcGF0aWFsMikpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkF2ZXJhZ2UgU3BhdGlhbCBEdXJhdGlvbiIsIHkgPSAiTnVtYmVyIikKaGlzdC5EdXJhdGlvbi5TcGF0aWFsMiArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbih3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5EdXJhdGlvbi5TcGF0aWFsMiA8LSBxcGxvdChzYW1wbGUgPSB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyKQpxcXBsb3QuRHVyYXRpb24uU3BhdGlhbDIKYm94cGxvdCh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRHVyYXRpb24iKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1EdXJhdGlvbi5TcGF0aWFsMiwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1EdXJhdGlvbi5TcGF0aWFsMikpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9RHVyYXRpb24uU3BhdGlhbDIsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LkR1cmF0aW9uLlNwYXRpYWwzIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoRHVyYXRpb24uU3BhdGlhbDMpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJBdmVyYWdlIFNwYXRpYWwgRHVyYXRpb24iLCB5ID0gIk51bWJlciIpCmhpc3QuRHVyYXRpb24uU3BhdGlhbDMgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4od2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZCh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwzLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuRHVyYXRpb24uU3BhdGlhbDMgPC0gcXBsb3Qoc2FtcGxlID0gd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMykKcXFwbG90LkR1cmF0aW9uLlNwYXRpYWwzCmJveHBsb3Qod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMywgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkR1cmF0aW9uIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9RHVyYXRpb24uU3BhdGlhbDMsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9RHVyYXRpb24uU3BhdGlhbDMpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PUR1cmF0aW9uLlNwYXRpYWwzLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5EdXJhdGlvbi5TcGF0aWFsIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoRHVyYXRpb24uU3BhdGlhbCkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkF2ZXJhZ2UgU3BhdGlhbCBEdXJhdGlvbiIsIHkgPSAiTnVtYmVyIikKaGlzdC5EdXJhdGlvbi5TcGF0aWFsICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZCh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5EdXJhdGlvbi5TcGF0aWFsIDwtIHFwbG90KHNhbXBsZSA9IHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbCkKcXFwbG90LkR1cmF0aW9uLlNwYXRpYWwKYm94cGxvdCh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEdXJhdGlvbiIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PUR1cmF0aW9uLlNwYXRpYWwsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9RHVyYXRpb24uU3BhdGlhbCkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9RHVyYXRpb24uU3BhdGlhbCwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCiMgRGlzdGFuY2UKCmhpc3QuRGlzdGFuY2UuQ3VlZCA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKERpc3RhbmNlLkN1ZWQpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJBdmVyYWdlIEN1ZWQgRGlzdGFuY2UiLCB5ID0gIk51bWJlciIpCmhpc3QuRGlzdGFuY2UuQ3VlZCArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbih3YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2Qod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5DdWVkLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuRGlzdGFuY2UuQ3VlZCA8LSBxcGxvdChzYW1wbGUgPSB3YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQpCnFxcGxvdC5EaXN0YW5jZS5DdWVkCmJveHBsb3Qod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5DdWVkLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRGlzdGFuY2UiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1EaXN0YW5jZS5DdWVkLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PURpc3RhbmNlLkN1ZWQpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PURpc3RhbmNlLkN1ZWQsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LkRpc3RhbmNlLlNwYXRpYWwxIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoRGlzdGFuY2UuU3BhdGlhbDEpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJBdmVyYWdlIFNwYXRpYWwgRGlzdGFuY2UiLCB5ID0gIk51bWJlciIpCmhpc3QuRGlzdGFuY2UuU3BhdGlhbDEgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4od2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZCh3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwxLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuRGlzdGFuY2UuU3BhdGlhbDEgPC0gcXBsb3Qoc2FtcGxlID0gd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMSkKcXFwbG90LkRpc3RhbmNlLlNwYXRpYWwxCmJveHBsb3Qod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMSwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkRpc3RhbmNlIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9RGlzdGFuY2UuU3BhdGlhbDEsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9RGlzdGFuY2UuU3BhdGlhbDEpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PURpc3RhbmNlLlNwYXRpYWwxLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5EaXN0YW5jZS5TcGF0aWFsMiA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKERpc3RhbmNlLlNwYXRpYWwyKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiQXZlcmFnZSBTcGF0aWFsIERpc3RhbmNlIiwgeSA9ICJOdW1iZXIiKQpoaXN0LkRpc3RhbmNlLlNwYXRpYWwyICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2Qod2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMiwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LkRpc3RhbmNlLlNwYXRpYWwyIDwtIHFwbG90KHNhbXBsZSA9IHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIpCnFxcGxvdC5EaXN0YW5jZS5TcGF0aWFsMgpib3hwbG90KHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEaXN0YW5jZSIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PURpc3RhbmNlLlNwYXRpYWwyLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PURpc3RhbmNlLlNwYXRpYWwyKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1EaXN0YW5jZS5TcGF0aWFsMiwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuRGlzdGFuY2UuU3BhdGlhbDMgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyhEaXN0YW5jZS5TcGF0aWFsMykpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkF2ZXJhZ2UgU3BhdGlhbCBEaXN0YW5jZSIsIHkgPSAiTnVtYmVyIikKaGlzdC5EaXN0YW5jZS5TcGF0aWFsMyArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbih3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwzLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5EaXN0YW5jZS5TcGF0aWFsMyA8LSBxcGxvdChzYW1wbGUgPSB3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwzKQpxcXBsb3QuRGlzdGFuY2UuU3BhdGlhbDMKYm94cGxvdCh3YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwzLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRGlzdGFuY2UiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1EaXN0YW5jZS5TcGF0aWFsMywgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1EaXN0YW5jZS5TcGF0aWFsMykpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9RGlzdGFuY2UuU3BhdGlhbDMsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LkRpc3RhbmNlLlNwYXRpYWwgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyhEaXN0YW5jZS5TcGF0aWFsKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiQXZlcmFnZSBTcGF0aWFsIERpc3RhbmNlIiwgeSA9ICJOdW1iZXIiKQpoaXN0LkRpc3RhbmNlLlNwYXRpYWwgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4od2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbCwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LkRpc3RhbmNlLlNwYXRpYWwgPC0gcXBsb3Qoc2FtcGxlID0gd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsKQpxcXBsb3QuRGlzdGFuY2UuU3BhdGlhbApib3hwbG90KHdhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbCwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkRpc3RhbmNlIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9RGlzdGFuY2UuU3BhdGlhbCwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1EaXN0YW5jZS5TcGF0aWFsKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1EaXN0YW5jZS5TcGF0aWFsLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKIyBTcGVlZAoKaGlzdC5TcGVlZCA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKFNwZWVkKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiQXZlcmFnZSBTcGVlZCIsIHkgPSAiTnVtYmVyIikKaGlzdC5TcGVlZCArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbih3YXRlcm1hemVkYXRhJFNwZWVkLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKHdhdGVybWF6ZWRhdGEkU3BlZWQsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5TcGVlZCA8LSBxcGxvdChzYW1wbGUgPSB3YXRlcm1hemVkYXRhJFNwZWVkKQpxcXBsb3QuU3BlZWQKYm94cGxvdCh3YXRlcm1hemVkYXRhJFNwZWVkLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iU3BlZWQiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1TcGVlZCwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1TcGVlZCkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9U3BlZWQsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgojIFByb2JlIHN0dWZmCgpoaXN0LlByb2JlLkVudHJpZXMuMSA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKFByb2JlLkVudHJpZXMuMSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkF2ZXJhZ2UgRW50cmllcyIsIHkgPSAiTnVtYmVyIikKaGlzdC5Qcm9iZS5FbnRyaWVzLjEgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4od2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjEsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2Qod2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjEsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Qcm9iZS5FbnRyaWVzLjEgPC0gcXBsb3Qoc2FtcGxlID0gd2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjEpCnFxcGxvdC5Qcm9iZS5FbnRyaWVzLjEKYm94cGxvdCh3YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMSwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkVudHJpZXMiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1Qcm9iZS5FbnRyaWVzLjEsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9UHJvYmUuRW50cmllcy4xKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1Qcm9iZS5FbnRyaWVzLjEsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgoKaGlzdC5Qcm9iZS5FbnRyaWVzLjIgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyhQcm9iZS5FbnRyaWVzLjIpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJFbnRyaWVzIiwgeSA9ICJOdW1iZXIiKQpoaXN0LlByb2JlLkVudHJpZXMuMiArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbih3YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMiwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZCh3YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMiwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LlByb2JlLkVudHJpZXMuMiA8LSBxcGxvdChzYW1wbGUgPSB3YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMikKcXFwbG90LlByb2JlLkVudHJpZXMuMgpib3hwbG90KHdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4yLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRW50cmllcyIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PVByb2JlLkVudHJpZXMuMiwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1Qcm9iZS5FbnRyaWVzLjIpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PVByb2JlLkVudHJpZXMuMiwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCgpoaXN0LlByb2JlLkVudHJpZXMuMyA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKFByb2JlLkVudHJpZXMuMykpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkVudHJpZXMiLCB5ID0gIk51bWJlciIpCmhpc3QuUHJvYmUuRW50cmllcy4zICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKHdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4zLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKHdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4zLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuUHJvYmUuRW50cmllcy4zIDwtIHFwbG90KHNhbXBsZSA9IHdhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4zKQpxcXBsb3QuUHJvYmUuRW50cmllcy4zCmJveHBsb3Qod2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjMsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJFbnRyaWVzIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9UHJvYmUuRW50cmllcy4zLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PVByb2JlLkVudHJpZXMuMykpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9UHJvYmUuRW50cmllcy4zLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKCmhpc3QuUHJvYmUuRW50cmllcy5BdmUgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyhQcm9iZS5FbnRyaWVzLkF2ZSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkVudHJpZXMiLCB5ID0gIk51bWJlciIpCmhpc3QuUHJvYmUuRW50cmllcy5BdmUgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4od2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLkF2ZSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZCh3YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuQXZlLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuUHJvYmUuRW50cmllcy5BdmUgPC0gcXBsb3Qoc2FtcGxlID0gd2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLkF2ZSkKcXFwbG90LlByb2JlLkVudHJpZXMuQXZlCmJveHBsb3Qod2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLkF2ZSwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkVudHJpZXMiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1Qcm9iZS5FbnRyaWVzLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1Qcm9iZS5FbnRyaWVzLkF2ZSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9UHJvYmUuRW50cmllcy5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgoKaGlzdC5Qcm9iZS5QZXJjZW50MSA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKFByb2JlLlBlcmNlbnQxKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiUGVyY2VudCIsIHkgPSAiTnVtYmVyIikKaGlzdC5Qcm9iZS5QZXJjZW50MSArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbih3YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQxLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKHdhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDEsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Qcm9iZS5QZXJjZW50MSA8LSBxcGxvdChzYW1wbGUgPSB3YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQxKQpxcXBsb3QuUHJvYmUuUGVyY2VudDEKYm94cGxvdCh3YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQxLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iUGVyY2VudCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PVByb2JlLlBlcmNlbnQxLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PVByb2JlLlBlcmNlbnQxKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1Qcm9iZS5QZXJjZW50MSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCgpoaXN0LlByb2JlLlBlcmNlbnQyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoUHJvYmUuUGVyY2VudDIpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJQZXJjZW50IiwgeSA9ICJOdW1iZXIiKQpoaXN0LlByb2JlLlBlcmNlbnQyICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKHdhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDIsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2Qod2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MiwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LlByb2JlLlBlcmNlbnQyIDwtIHFwbG90KHNhbXBsZSA9IHdhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDIpCnFxcGxvdC5Qcm9iZS5QZXJjZW50Mgpib3hwbG90KHdhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDIsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJQZXJjZW50IikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9UHJvYmUuUGVyY2VudDIsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9UHJvYmUuUGVyY2VudDIpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PVByb2JlLlBlcmNlbnQyLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKCmhpc3QuUHJvYmUuUGVyY2VudDMgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyhQcm9iZS5QZXJjZW50MykpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIlBlcmNlbnQiLCB5ID0gIk51bWJlciIpCmhpc3QuUHJvYmUuUGVyY2VudDMgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4od2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZCh3YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQzLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuUHJvYmUuUGVyY2VudDMgPC0gcXBsb3Qoc2FtcGxlID0gd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MykKcXFwbG90LlByb2JlLlBlcmNlbnQzCmJveHBsb3Qod2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MywgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IlBlcmNlbnQiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1Qcm9iZS5QZXJjZW50MywgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1Qcm9iZS5QZXJjZW50MykpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9UHJvYmUuUGVyY2VudDMsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgoKaGlzdC5Qcm9iZS5QZXJjZW50LkF2ZSA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKFByb2JlLlBlcmNlbnQuQXZlKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiUGVyY2VudCIsIHkgPSAiTnVtYmVyIikKaGlzdC5Qcm9iZS5QZXJjZW50LkF2ZSArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbih3YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQuQXZlLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKHdhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudC5BdmUsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Qcm9iZS5QZXJjZW50LkF2ZSA8LSBxcGxvdChzYW1wbGUgPSB3YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQuQXZlKQpxcXBsb3QuUHJvYmUuUGVyY2VudC5BdmUKYm94cGxvdCh3YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQuQXZlLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iUGVyY2VudCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PVByb2JlLlBlcmNlbnQuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PVByb2JlLlBlcmNlbnQuQXZlKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1Qcm9iZS5QZXJjZW50LkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuUHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyhQcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIlBlcmNlbnQiLCB5ID0gIk51bWJlciIpCmhpc3QuUHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4od2F0ZXJtYXplZGF0YSRQcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZCh3YXRlcm1hemVkYXRhJFByb2JlMi5PcHBvc2l0ZS5QZXJjZW50LCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuUHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQgPC0gcXBsb3Qoc2FtcGxlID0gd2F0ZXJtYXplZGF0YSRQcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCkKcXFwbG90LlByb2JlMi5PcHBvc2l0ZS5QZXJjZW50CmJveHBsb3Qod2F0ZXJtYXplZGF0YSRQcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IlBlcmNlbnQiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1Qcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1Qcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9UHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgoKIyBXb3JraW5nIG1lbW9yeSBzdHVmZgoKaGlzdC5Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyhXb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJEdXJhdGlvbiIsIHkgPSAiTnVtYmVyIikKaGlzdC5Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4od2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2Qod2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUgPC0gcXBsb3Qoc2FtcGxlID0gd2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUpCnFxcGxvdC5Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUKYm94cGxvdCh3YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uVHJpYWwxLkF2ZSwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkR1cmF0aW9uIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9V29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PVdvcmtpbmcuRHVyYXRpb24uVHJpYWwxLkF2ZSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9V29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKCmhpc3QuV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiRHVyYXRpb24iLCB5ID0gIk51bWJlciIpCmhpc3QuV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKHdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKHdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlIDwtIHFwbG90KHNhbXBsZSA9IHdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlKQpxcXBsb3QuV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlCmJveHBsb3Qod2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMi5BdmUsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEdXJhdGlvbiIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PVdvcmtpbmcuRHVyYXRpb24uVHJpYWwyLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMi5BdmUpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PVdvcmtpbmcuRHVyYXRpb24uVHJpYWwyLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKFdvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJEdXJhdGlvbiIsIHkgPSAiTnVtYmVyIikKaGlzdC5Xb3JraW5nLkR1cmF0aW9uLkRpZmYuQXZlICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKHdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZCh3YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Xb3JraW5nLkR1cmF0aW9uLkRpZmYuQXZlIDwtIHFwbG90KHNhbXBsZSA9IHdhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSkKcXFwbG90LldvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUKYm94cGxvdCh3YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEdXJhdGlvbiIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PVdvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9V29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9V29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCgpoaXN0LldvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkRpc3RhbmNlIiwgeSA9ICJOdW1iZXIiKQpoaXN0LldvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbih3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZCh3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LldvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSA8LSBxcGxvdChzYW1wbGUgPSB3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSkKcXFwbG90LldvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZQpib3hwbG90KHdhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5UcmlhbDEuQXZlLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRGlzdGFuY2UiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMS5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9V29ya2luZy5EaXN0YW5jZS5UcmlhbDEuQXZlKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9MCwgeT1Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMS5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgoKaGlzdC5Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyhXb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJEaXN0YW5jZSIsIHkgPSAiTnVtYmVyIikKaGlzdC5Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4od2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2Qod2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUgPC0gcXBsb3Qoc2FtcGxlID0gd2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUpCnFxcGxvdC5Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUKYm94cGxvdCh3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkRpc3RhbmNlIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9V29ya2luZy5EaXN0YW5jZS5UcmlhbDIuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PVdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9V29ya2luZy5EaXN0YW5jZS5UcmlhbDIuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKCmhpc3QuV29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKFdvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJEaXN0YW5jZSIsIHkgPSAiTnVtYmVyIikKaGlzdC5Xb3JraW5nLkRpc3RhbmNlLkRpZmYuQXZlICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKHdhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZCh3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Xb3JraW5nLkRpc3RhbmNlLkRpZmYuQXZlIDwtIHFwbG90KHNhbXBsZSA9IHdhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSkKcXFwbG90LldvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUKYm94cGxvdCh3YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEaXN0YW5jZSIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD0wLCB5PVdvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9V29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PTAsIHk9V29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmBgYAoKTm93LCB2aXN1YWxseSBjaGVjayBlYWNoIHZhcmlhYmxlIGRhdGEgZm9yIG5vcm1hbGl0eSAvIG91dGxpZXJzIGJyb2tlbiBkb3duIGJ5IGdyb3VwIC0gaGlzdG9ncmFtcyBhbmQgUVEgcGxvdHMgYW5kIGJveCBwbG90cyBmb3IgZWFjaCBUcmVhdG1lbnQgZ3JvdXAuCgpgYGB7cn0KIyBCcm9rZW4gZG93biBieSBncm91cCAodXNlIHRoZSAic3Vic2V0IiBkYXRhZnJhbWVzIHRoYXQgd2VyZSBkZXJpdmVkIGVhcmxpZXIpCgojIEFjCiMgRHVyYXRpb24KCmhpc3QuRHVyYXRpb24uQ3VlZCA8LSBnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKER1cmF0aW9uLkN1ZWQpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJBdmVyYWdlIEN1ZWQgRHVyYXRpb24iLCB5ID0gIk51bWJlciIpCmhpc3QuRHVyYXRpb24uQ3VlZCArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihBY193YXRlcm1hemVkYXRhJER1cmF0aW9uLkN1ZWQsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoQWNfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5DdWVkLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuRHVyYXRpb24uQ3VlZCA8LSBxcGxvdChzYW1wbGUgPSBBY193YXRlcm1hemVkYXRhJER1cmF0aW9uLkN1ZWQpCnFxcGxvdC5EdXJhdGlvbi5DdWVkCmJveHBsb3QoQWNfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5DdWVkLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRHVyYXRpb24iKQpnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLkN1ZWQsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EdXJhdGlvbi5DdWVkKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLkN1ZWQsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgoKaGlzdC5EdXJhdGlvbi5TcGF0aWFsMSA8LSBnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKER1cmF0aW9uLlNwYXRpYWwxKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiQXZlcmFnZSBTcGF0aWFsIER1cmF0aW9uIiwgeSA9ICJOdW1iZXIiKQpoaXN0LkR1cmF0aW9uLlNwYXRpYWwxICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEFjX3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDEsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoQWNfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMSwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LkR1cmF0aW9uLlNwYXRpYWwxIDwtIHFwbG90KHNhbXBsZSA9IEFjX3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDEpCnFxcGxvdC5EdXJhdGlvbi5TcGF0aWFsMQpib3hwbG90KEFjX3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDEsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEdXJhdGlvbiIpCmdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uU3BhdGlhbDEsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EdXJhdGlvbi5TcGF0aWFsMSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EdXJhdGlvbi5TcGF0aWFsMSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCgpoaXN0LkR1cmF0aW9uLlNwYXRpYWwyIDwtIGdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoRHVyYXRpb24uU3BhdGlhbDIpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJBdmVyYWdlIFNwYXRpYWwgRHVyYXRpb24iLCB5ID0gIk51bWJlciIpCmhpc3QuRHVyYXRpb24uU3BhdGlhbDIgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oQWNfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMiwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChBY193YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuRHVyYXRpb24uU3BhdGlhbDIgPC0gcXBsb3Qoc2FtcGxlID0gQWNfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMikKcXFwbG90LkR1cmF0aW9uLlNwYXRpYWwyCmJveHBsb3QoQWNfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMiwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkR1cmF0aW9uIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EdXJhdGlvbi5TcGF0aWFsMiwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLlNwYXRpYWwyKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLlNwYXRpYWwyLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5EdXJhdGlvbi5TcGF0aWFsMyA8LSBnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKER1cmF0aW9uLlNwYXRpYWwzKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiQXZlcmFnZSBTcGF0aWFsIER1cmF0aW9uIiwgeSA9ICJOdW1iZXIiKQpoaXN0LkR1cmF0aW9uLlNwYXRpYWwzICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEFjX3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDMsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoQWNfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMywgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LkR1cmF0aW9uLlNwYXRpYWwzIDwtIHFwbG90KHNhbXBsZSA9IEFjX3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDMpCnFxcGxvdC5EdXJhdGlvbi5TcGF0aWFsMwpib3hwbG90KEFjX3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDMsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEdXJhdGlvbiIpCmdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uU3BhdGlhbDMsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EdXJhdGlvbi5TcGF0aWFsMykpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EdXJhdGlvbi5TcGF0aWFsMywgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuRHVyYXRpb24uU3BhdGlhbCA8LSBnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKER1cmF0aW9uLlNwYXRpYWwpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJBdmVyYWdlIFNwYXRpYWwgRHVyYXRpb24iLCB5ID0gIk51bWJlciIpCmhpc3QuRHVyYXRpb24uU3BhdGlhbCArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihBY193YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoQWNfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuRHVyYXRpb24uU3BhdGlhbCA8LSBxcGxvdChzYW1wbGUgPSBBY193YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwpCnFxcGxvdC5EdXJhdGlvbi5TcGF0aWFsCmJveHBsb3QoQWNfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRHVyYXRpb24iKQpnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLlNwYXRpYWwsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EdXJhdGlvbi5TcGF0aWFsKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLlNwYXRpYWwsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgojIERpc3RhbmNlCgpoaXN0LkRpc3RhbmNlLkN1ZWQgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyhEaXN0YW5jZS5DdWVkKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiQXZlcmFnZSBDdWVkIERpc3RhbmNlIiwgeSA9ICJOdW1iZXIiKQpoaXN0LkRpc3RhbmNlLkN1ZWQgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oQWNfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5DdWVkLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEFjX3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuQ3VlZCwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LkRpc3RhbmNlLkN1ZWQgPC0gcXBsb3Qoc2FtcGxlID0gQWNfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5DdWVkKQpxcXBsb3QuRGlzdGFuY2UuQ3VlZApib3hwbG90KEFjX3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuQ3VlZCwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkRpc3RhbmNlIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EaXN0YW5jZS5DdWVkLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuQ3VlZCkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EaXN0YW5jZS5DdWVkLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5EaXN0YW5jZS5TcGF0aWFsMSA8LSBnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKERpc3RhbmNlLlNwYXRpYWwxKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiQXZlcmFnZSBTcGF0aWFsIERpc3RhbmNlIiwgeSA9ICJOdW1iZXIiKQpoaXN0LkRpc3RhbmNlLlNwYXRpYWwxICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEFjX3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDEsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoQWNfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMSwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LkRpc3RhbmNlLlNwYXRpYWwxIDwtIHFwbG90KHNhbXBsZSA9IEFjX3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDEpCnFxcGxvdC5EaXN0YW5jZS5TcGF0aWFsMQpib3hwbG90KEFjX3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDEsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEaXN0YW5jZSIpCmdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuU3BhdGlhbDEsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EaXN0YW5jZS5TcGF0aWFsMSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EaXN0YW5jZS5TcGF0aWFsMSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuRGlzdGFuY2UuU3BhdGlhbDIgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyhEaXN0YW5jZS5TcGF0aWFsMikpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkF2ZXJhZ2UgU3BhdGlhbCBEaXN0YW5jZSIsIHkgPSAiTnVtYmVyIikKaGlzdC5EaXN0YW5jZS5TcGF0aWFsMiArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihBY193YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwyLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEFjX3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5EaXN0YW5jZS5TcGF0aWFsMiA8LSBxcGxvdChzYW1wbGUgPSBBY193YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwyKQpxcXBsb3QuRGlzdGFuY2UuU3BhdGlhbDIKYm94cGxvdChBY193YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwyLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRGlzdGFuY2UiKQpnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLlNwYXRpYWwyLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuU3BhdGlhbDIpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuU3BhdGlhbDIsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LkRpc3RhbmNlLlNwYXRpYWwzIDwtIGdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoRGlzdGFuY2UuU3BhdGlhbDMpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJBdmVyYWdlIFNwYXRpYWwgRGlzdGFuY2UiLCB5ID0gIk51bWJlciIpCmhpc3QuRGlzdGFuY2UuU3BhdGlhbDMgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oQWNfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChBY193YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwzLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuRGlzdGFuY2UuU3BhdGlhbDMgPC0gcXBsb3Qoc2FtcGxlID0gQWNfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMykKcXFwbG90LkRpc3RhbmNlLlNwYXRpYWwzCmJveHBsb3QoQWNfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMywgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkRpc3RhbmNlIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EaXN0YW5jZS5TcGF0aWFsMywgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLlNwYXRpYWwzKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLlNwYXRpYWwzLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5EaXN0YW5jZS5TcGF0aWFsIDwtIGdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoRGlzdGFuY2UuU3BhdGlhbCkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkF2ZXJhZ2UgU3BhdGlhbCBEaXN0YW5jZSIsIHkgPSAiTnVtYmVyIikKaGlzdC5EaXN0YW5jZS5TcGF0aWFsICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEFjX3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChBY193YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5EaXN0YW5jZS5TcGF0aWFsIDwtIHFwbG90KHNhbXBsZSA9IEFjX3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbCkKcXFwbG90LkRpc3RhbmNlLlNwYXRpYWwKYm94cGxvdChBY193YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEaXN0YW5jZSIpCmdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuU3BhdGlhbCwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLlNwYXRpYWwpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuU3BhdGlhbCwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCiMgU3BlZWQKCmhpc3QuU3BlZWQgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyhTcGVlZCkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkF2ZXJhZ2UgU3BlZWQiLCB5ID0gIk51bWJlciIpCmhpc3QuU3BlZWQgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oQWNfd2F0ZXJtYXplZGF0YSRTcGVlZCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChBY193YXRlcm1hemVkYXRhJFNwZWVkLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuU3BlZWQgPC0gcXBsb3Qoc2FtcGxlID0gQWNfd2F0ZXJtYXplZGF0YSRTcGVlZCkKcXFwbG90LlNwZWVkCmJveHBsb3QoQWNfd2F0ZXJtYXplZGF0YSRTcGVlZCwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IlNwZWVkIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1TcGVlZCwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVNwZWVkKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVNwZWVkLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKCiMgUHJvYmUgc3R1ZmYKCmhpc3QuUHJvYmUuRW50cmllcy4xIDwtIGdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoUHJvYmUuRW50cmllcy4xKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiQXZlcmFnZSBFbnRyaWVzIiwgeSA9ICJOdW1iZXIiKQpoaXN0LlByb2JlLkVudHJpZXMuMSArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihBY193YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChBY193YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMSwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LlByb2JlLkVudHJpZXMuMSA8LSBxcGxvdChzYW1wbGUgPSBBY193YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMSkKcXFwbG90LlByb2JlLkVudHJpZXMuMQpib3hwbG90KEFjX3dhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4xLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRW50cmllcyIpCmdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuRW50cmllcy4xLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuRW50cmllcy4xKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuMSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuUHJvYmUuRW50cmllcy4yIDwtIGdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoUHJvYmUuRW50cmllcy4yKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiRW50cmllcyIsIHkgPSAiTnVtYmVyIikKaGlzdC5Qcm9iZS5FbnRyaWVzLjIgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oQWNfd2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjIsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoQWNfd2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjIsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Qcm9iZS5FbnRyaWVzLjIgPC0gcXBsb3Qoc2FtcGxlID0gQWNfd2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjIpCnFxcGxvdC5Qcm9iZS5FbnRyaWVzLjIKYm94cGxvdChBY193YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMiwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkVudHJpZXMiKQpnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuMiwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuMikpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5FbnRyaWVzLjIsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LlByb2JlLkVudHJpZXMuMyA8LSBnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKFByb2JlLkVudHJpZXMuMykpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkVudHJpZXMiLCB5ID0gIk51bWJlciIpCmhpc3QuUHJvYmUuRW50cmllcy4zICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEFjX3dhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4zLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEFjX3dhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4zLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuUHJvYmUuRW50cmllcy4zIDwtIHFwbG90KHNhbXBsZSA9IEFjX3dhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4zKQpxcXBsb3QuUHJvYmUuRW50cmllcy4zCmJveHBsb3QoQWNfd2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjMsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJFbnRyaWVzIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5FbnRyaWVzLjMsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5FbnRyaWVzLjMpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuRW50cmllcy4zLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5Qcm9iZS5FbnRyaWVzLkF2ZSA8LSBnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKFByb2JlLkVudHJpZXMuQXZlKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiRW50cmllcyIsIHkgPSAiTnVtYmVyIikKaGlzdC5Qcm9iZS5FbnRyaWVzLkF2ZSArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihBY193YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuQXZlLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEFjX3dhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy5BdmUsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Qcm9iZS5FbnRyaWVzLkF2ZSA8LSBxcGxvdChzYW1wbGUgPSBBY193YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuQXZlKQpxcXBsb3QuUHJvYmUuRW50cmllcy5BdmUKYm94cGxvdChBY193YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuQXZlLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRW50cmllcyIpCmdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuRW50cmllcy5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5FbnRyaWVzLkF2ZSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5FbnRyaWVzLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuUHJvYmUuUGVyY2VudDEgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyhQcm9iZS5QZXJjZW50MSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIlBlcmNlbnQiLCB5ID0gIk51bWJlciIpCmhpc3QuUHJvYmUuUGVyY2VudDEgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oQWNfd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChBY193YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQxLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuUHJvYmUuUGVyY2VudDEgPC0gcXBsb3Qoc2FtcGxlID0gQWNfd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MSkKcXFwbG90LlByb2JlLlBlcmNlbnQxCmJveHBsb3QoQWNfd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MSwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IlBlcmNlbnQiKQpnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLlBlcmNlbnQxLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudDEpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudDEsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LlByb2JlLlBlcmNlbnQyIDwtIGdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoUHJvYmUuUGVyY2VudDIpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJQZXJjZW50IiwgeSA9ICJOdW1iZXIiKQpoaXN0LlByb2JlLlBlcmNlbnQyICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEFjX3dhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDIsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoQWNfd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MiwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LlByb2JlLlBlcmNlbnQyIDwtIHFwbG90KHNhbXBsZSA9IEFjX3dhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDIpCnFxcGxvdC5Qcm9iZS5QZXJjZW50Mgpib3hwbG90KEFjX3dhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDIsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJQZXJjZW50IikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5QZXJjZW50MiwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLlBlcmNlbnQyKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLlBlcmNlbnQyLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5Qcm9iZS5QZXJjZW50MyA8LSBnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKFByb2JlLlBlcmNlbnQzKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiUGVyY2VudCIsIHkgPSAiTnVtYmVyIikKaGlzdC5Qcm9iZS5QZXJjZW50MyArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihBY193YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQzLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEFjX3dhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDMsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Qcm9iZS5QZXJjZW50MyA8LSBxcGxvdChzYW1wbGUgPSBBY193YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQzKQpxcXBsb3QuUHJvYmUuUGVyY2VudDMKYm94cGxvdChBY193YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQzLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iUGVyY2VudCIpCmdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudDMsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5QZXJjZW50MykpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5QZXJjZW50MywgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuUHJvYmUuUGVyY2VudC5BdmUgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyhQcm9iZS5QZXJjZW50LkF2ZSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIlBlcmNlbnQiLCB5ID0gIk51bWJlciIpCmhpc3QuUHJvYmUuUGVyY2VudC5BdmUgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oQWNfd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50LkF2ZSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChBY193YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQuQXZlLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuUHJvYmUuUGVyY2VudC5BdmUgPC0gcXBsb3Qoc2FtcGxlID0gQWNfd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50LkF2ZSkKcXFwbG90LlByb2JlLlBlcmNlbnQuQXZlCmJveHBsb3QoQWNfd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50LkF2ZSwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IlBlcmNlbnQiKQpnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLlBlcmNlbnQuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudC5BdmUpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudC5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LlByb2JlMi5PcHBvc2l0ZS5QZXJjZW50IDwtIGdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoUHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJQZXJjZW50IiwgeSA9ICJOdW1iZXIiKQpoaXN0LlByb2JlMi5PcHBvc2l0ZS5QZXJjZW50ICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEFjX3dhdGVybWF6ZWRhdGEkUHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoQWNfd2F0ZXJtYXplZGF0YSRQcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LlByb2JlMi5PcHBvc2l0ZS5QZXJjZW50IDwtIHFwbG90KHNhbXBsZSA9IEFjX3dhdGVybWF6ZWRhdGEkUHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQpCnFxcGxvdC5Qcm9iZTIuT3Bwb3NpdGUuUGVyY2VudApib3hwbG90KEFjX3dhdGVybWF6ZWRhdGEkUHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJQZXJjZW50IikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlMi5PcHBvc2l0ZS5QZXJjZW50KSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoQWNfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlMi5PcHBvc2l0ZS5QZXJjZW50LCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKIyBXb3JraW5nIG1lbW9yeSBzdHVmZgoKaGlzdC5Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyhXb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJEdXJhdGlvbiIsIHkgPSAiTnVtYmVyIikKaGlzdC5Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oQWNfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoQWNfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUgPC0gcXBsb3Qoc2FtcGxlID0gQWNfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUpCnFxcGxvdC5Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUKYm94cGxvdChBY193YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uVHJpYWwxLkF2ZSwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkR1cmF0aW9uIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9V29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMi5BdmUgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyhXb3JraW5nLkR1cmF0aW9uLlRyaWFsMi5BdmUpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJEdXJhdGlvbiIsIHkgPSAiTnVtYmVyIikKaGlzdC5Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMi5BdmUgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oQWNfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMi5BdmUsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoQWNfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMi5BdmUsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMi5BdmUgPC0gcXBsb3Qoc2FtcGxlID0gQWNfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMi5BdmUpCnFxcGxvdC5Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMi5BdmUKYm94cGxvdChBY193YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uVHJpYWwyLkF2ZSwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkR1cmF0aW9uIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMi5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMi5BdmUpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9V29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5Xb3JraW5nLkR1cmF0aW9uLkRpZmYuQXZlIDwtIGdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkR1cmF0aW9uIiwgeSA9ICJOdW1iZXIiKQpoaXN0LldvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oQWNfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLkRpZmYuQXZlLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEFjX3dhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LldvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUgPC0gcXBsb3Qoc2FtcGxlID0gQWNfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLkRpZmYuQXZlKQpxcXBsb3QuV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZQpib3hwbG90KEFjX3dhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkR1cmF0aW9uIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkR1cmF0aW9uLkRpZmYuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9V29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkR1cmF0aW9uLkRpZmYuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMS5BdmUgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyhXb3JraW5nLkRpc3RhbmNlLlRyaWFsMS5BdmUpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJEaXN0YW5jZSIsIHkgPSAiTnVtYmVyIikKaGlzdC5Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMS5BdmUgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oQWNfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLlRyaWFsMS5BdmUsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoQWNfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLlRyaWFsMS5BdmUsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMS5BdmUgPC0gcXBsb3Qoc2FtcGxlID0gQWNfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLlRyaWFsMS5BdmUpCnFxcGxvdC5Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMS5BdmUKYm94cGxvdChBY193YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkRpc3RhbmNlIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMS5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMS5BdmUpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9V29ya2luZy5EaXN0YW5jZS5UcmlhbDEuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyhXb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJEaXN0YW5jZSIsIHkgPSAiTnVtYmVyIikKaGlzdC5Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oQWNfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoQWNfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUgPC0gcXBsb3Qoc2FtcGxlID0gQWNfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUpCnFxcGxvdC5Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUKYm94cGxvdChBY193YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkRpc3RhbmNlIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9V29ya2luZy5EaXN0YW5jZS5UcmlhbDIuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5Xb3JraW5nLkRpc3RhbmNlLkRpZmYuQXZlIDwtIGdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoV29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkRpc3RhbmNlIiwgeSA9ICJOdW1iZXIiKQpoaXN0LldvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oQWNfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLkRpZmYuQXZlLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEFjX3dhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LldvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUgPC0gcXBsb3Qoc2FtcGxlID0gQWNfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLkRpZmYuQXZlKQpxcXBsb3QuV29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZQpib3hwbG90KEFjX3dhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkRpc3RhbmNlIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkRpc3RhbmNlLkRpZmYuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChBY193YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9V29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KEFjX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkRpc3RhbmNlLkRpZmYuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKIyBGeAojIER1cmF0aW9uCgpoaXN0LkR1cmF0aW9uLkN1ZWQgPC0gZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyhEdXJhdGlvbi5DdWVkKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiQXZlcmFnZSBDdWVkIER1cmF0aW9uIiwgeSA9ICJOdW1iZXIiKQpoaXN0LkR1cmF0aW9uLkN1ZWQgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oRnhfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5DdWVkLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEZ4X3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZCwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LkR1cmF0aW9uLkN1ZWQgPC0gcXBsb3Qoc2FtcGxlID0gRnhfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5DdWVkKQpxcXBsb3QuRHVyYXRpb24uQ3VlZApib3hwbG90KEZ4X3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZCwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkR1cmF0aW9uIikKZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EdXJhdGlvbi5DdWVkLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uQ3VlZCkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EdXJhdGlvbi5DdWVkLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKCmhpc3QuRHVyYXRpb24uU3BhdGlhbDEgPC0gZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyhEdXJhdGlvbi5TcGF0aWFsMSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkF2ZXJhZ2UgU3BhdGlhbCBEdXJhdGlvbiIsIHkgPSAiTnVtYmVyIikKaGlzdC5EdXJhdGlvbi5TcGF0aWFsMSArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihGeF93YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEZ4X3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDEsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5EdXJhdGlvbi5TcGF0aWFsMSA8LSBxcGxvdChzYW1wbGUgPSBGeF93YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxKQpxcXBsb3QuRHVyYXRpb24uU3BhdGlhbDEKYm94cGxvdChGeF93YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRHVyYXRpb24iKQpnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLlNwYXRpYWwxLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uU3BhdGlhbDEpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uU3BhdGlhbDEsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgoKaGlzdC5EdXJhdGlvbi5TcGF0aWFsMiA8LSBnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKER1cmF0aW9uLlNwYXRpYWwyKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiQXZlcmFnZSBTcGF0aWFsIER1cmF0aW9uIiwgeSA9ICJOdW1iZXIiKQpoaXN0LkR1cmF0aW9uLlNwYXRpYWwyICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEZ4X3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoRnhfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMiwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LkR1cmF0aW9uLlNwYXRpYWwyIDwtIHFwbG90KHNhbXBsZSA9IEZ4X3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIpCnFxcGxvdC5EdXJhdGlvbi5TcGF0aWFsMgpib3hwbG90KEZ4X3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEdXJhdGlvbiIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uU3BhdGlhbDIsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EdXJhdGlvbi5TcGF0aWFsMikpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EdXJhdGlvbi5TcGF0aWFsMiwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuRHVyYXRpb24uU3BhdGlhbDMgPC0gZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyhEdXJhdGlvbi5TcGF0aWFsMykpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkF2ZXJhZ2UgU3BhdGlhbCBEdXJhdGlvbiIsIHkgPSAiTnVtYmVyIikKaGlzdC5EdXJhdGlvbi5TcGF0aWFsMyArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihGeF93YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwzLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEZ4X3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDMsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5EdXJhdGlvbi5TcGF0aWFsMyA8LSBxcGxvdChzYW1wbGUgPSBGeF93YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwzKQpxcXBsb3QuRHVyYXRpb24uU3BhdGlhbDMKYm94cGxvdChGeF93YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwzLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRHVyYXRpb24iKQpnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLlNwYXRpYWwzLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uU3BhdGlhbDMpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uU3BhdGlhbDMsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LkR1cmF0aW9uLlNwYXRpYWwgPC0gZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyhEdXJhdGlvbi5TcGF0aWFsKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiQXZlcmFnZSBTcGF0aWFsIER1cmF0aW9uIiwgeSA9ICJOdW1iZXIiKQpoaXN0LkR1cmF0aW9uLlNwYXRpYWwgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oRnhfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEZ4X3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbCwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LkR1cmF0aW9uLlNwYXRpYWwgPC0gcXBsb3Qoc2FtcGxlID0gRnhfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsKQpxcXBsb3QuRHVyYXRpb24uU3BhdGlhbApib3hwbG90KEZ4X3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbCwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkR1cmF0aW9uIikKZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EdXJhdGlvbi5TcGF0aWFsLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uU3BhdGlhbCkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EdXJhdGlvbi5TcGF0aWFsLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKIyBEaXN0YW5jZQoKaGlzdC5EaXN0YW5jZS5DdWVkIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoRGlzdGFuY2UuQ3VlZCkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkF2ZXJhZ2UgQ3VlZCBEaXN0YW5jZSIsIHkgPSAiTnVtYmVyIikKaGlzdC5EaXN0YW5jZS5DdWVkICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEZ4X3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuQ3VlZCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChGeF93YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5EaXN0YW5jZS5DdWVkIDwtIHFwbG90KHNhbXBsZSA9IEZ4X3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuQ3VlZCkKcXFwbG90LkRpc3RhbmNlLkN1ZWQKYm94cGxvdChGeF93YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEaXN0YW5jZSIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuQ3VlZCwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLkN1ZWQpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuQ3VlZCwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuRGlzdGFuY2UuU3BhdGlhbDEgPC0gZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyhEaXN0YW5jZS5TcGF0aWFsMSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkF2ZXJhZ2UgU3BhdGlhbCBEaXN0YW5jZSIsIHkgPSAiTnVtYmVyIikKaGlzdC5EaXN0YW5jZS5TcGF0aWFsMSArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihGeF93YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwxLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEZ4X3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDEsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5EaXN0YW5jZS5TcGF0aWFsMSA8LSBxcGxvdChzYW1wbGUgPSBGeF93YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwxKQpxcXBsb3QuRGlzdGFuY2UuU3BhdGlhbDEKYm94cGxvdChGeF93YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwxLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRGlzdGFuY2UiKQpnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLlNwYXRpYWwxLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuU3BhdGlhbDEpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuU3BhdGlhbDEsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LkRpc3RhbmNlLlNwYXRpYWwyIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoRGlzdGFuY2UuU3BhdGlhbDIpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJBdmVyYWdlIFNwYXRpYWwgRGlzdGFuY2UiLCB5ID0gIk51bWJlciIpCmhpc3QuRGlzdGFuY2UuU3BhdGlhbDIgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oRnhfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMiwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChGeF93YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwyLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuRGlzdGFuY2UuU3BhdGlhbDIgPC0gcXBsb3Qoc2FtcGxlID0gRnhfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMikKcXFwbG90LkRpc3RhbmNlLlNwYXRpYWwyCmJveHBsb3QoRnhfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMiwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkRpc3RhbmNlIikKZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EaXN0YW5jZS5TcGF0aWFsMiwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLlNwYXRpYWwyKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLlNwYXRpYWwyLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5EaXN0YW5jZS5TcGF0aWFsMyA8LSBnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKERpc3RhbmNlLlNwYXRpYWwzKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiQXZlcmFnZSBTcGF0aWFsIERpc3RhbmNlIiwgeSA9ICJOdW1iZXIiKQpoaXN0LkRpc3RhbmNlLlNwYXRpYWwzICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEZ4X3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoRnhfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMywgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LkRpc3RhbmNlLlNwYXRpYWwzIDwtIHFwbG90KHNhbXBsZSA9IEZ4X3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMpCnFxcGxvdC5EaXN0YW5jZS5TcGF0aWFsMwpib3hwbG90KEZ4X3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEaXN0YW5jZSIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuU3BhdGlhbDMsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EaXN0YW5jZS5TcGF0aWFsMykpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EaXN0YW5jZS5TcGF0aWFsMywgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuRGlzdGFuY2UuU3BhdGlhbCA8LSBnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKERpc3RhbmNlLlNwYXRpYWwpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJBdmVyYWdlIFNwYXRpYWwgRGlzdGFuY2UiLCB5ID0gIk51bWJlciIpCmhpc3QuRGlzdGFuY2UuU3BhdGlhbCArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihGeF93YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoRnhfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuRGlzdGFuY2UuU3BhdGlhbCA8LSBxcGxvdChzYW1wbGUgPSBGeF93YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwpCnFxcGxvdC5EaXN0YW5jZS5TcGF0aWFsCmJveHBsb3QoRnhfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRGlzdGFuY2UiKQpnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLlNwYXRpYWwsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EaXN0YW5jZS5TcGF0aWFsKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLlNwYXRpYWwsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgojIFNwZWVkCgpoaXN0LlNwZWVkIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoU3BlZWQpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJBdmVyYWdlIFNwZWVkIiwgeSA9ICJOdW1iZXIiKQpoaXN0LlNwZWVkICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEZ4X3dhdGVybWF6ZWRhdGEkU3BlZWQsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoRnhfd2F0ZXJtYXplZGF0YSRTcGVlZCwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LlNwZWVkIDwtIHFwbG90KHNhbXBsZSA9IEZ4X3dhdGVybWF6ZWRhdGEkU3BlZWQpCnFxcGxvdC5TcGVlZApib3hwbG90KEZ4X3dhdGVybWF6ZWRhdGEkU3BlZWQsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJTcGVlZCIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9U3BlZWQsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1TcGVlZCkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1TcGVlZCwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCgojIFByb2JlIHN0dWZmCgpoaXN0LlByb2JlLkVudHJpZXMuMSA8LSBnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKFByb2JlLkVudHJpZXMuMSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkF2ZXJhZ2UgRW50cmllcyIsIHkgPSAiTnVtYmVyIikKaGlzdC5Qcm9iZS5FbnRyaWVzLjEgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oRnhfd2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjEsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoRnhfd2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjEsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Qcm9iZS5FbnRyaWVzLjEgPC0gcXBsb3Qoc2FtcGxlID0gRnhfd2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjEpCnFxcGxvdC5Qcm9iZS5FbnRyaWVzLjEKYm94cGxvdChGeF93YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMSwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkVudHJpZXMiKQpnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuMSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuMSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5FbnRyaWVzLjEsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LlByb2JlLkVudHJpZXMuMiA8LSBnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKFByb2JlLkVudHJpZXMuMikpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkVudHJpZXMiLCB5ID0gIk51bWJlciIpCmhpc3QuUHJvYmUuRW50cmllcy4yICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEZ4X3dhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4yLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEZ4X3dhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4yLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuUHJvYmUuRW50cmllcy4yIDwtIHFwbG90KHNhbXBsZSA9IEZ4X3dhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4yKQpxcXBsb3QuUHJvYmUuRW50cmllcy4yCmJveHBsb3QoRnhfd2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjIsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJFbnRyaWVzIikKZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5FbnRyaWVzLjIsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5FbnRyaWVzLjIpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuRW50cmllcy4yLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5Qcm9iZS5FbnRyaWVzLjMgPC0gZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyhQcm9iZS5FbnRyaWVzLjMpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJFbnRyaWVzIiwgeSA9ICJOdW1iZXIiKQpoaXN0LlByb2JlLkVudHJpZXMuMyArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihGeF93YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChGeF93YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMywgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LlByb2JlLkVudHJpZXMuMyA8LSBxcGxvdChzYW1wbGUgPSBGeF93YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMykKcXFwbG90LlByb2JlLkVudHJpZXMuMwpib3hwbG90KEZ4X3dhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4zLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRW50cmllcyIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuRW50cmllcy4zLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuRW50cmllcy4zKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuMywgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuUHJvYmUuRW50cmllcy5BdmUgPC0gZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyhQcm9iZS5FbnRyaWVzLkF2ZSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkVudHJpZXMiLCB5ID0gIk51bWJlciIpCmhpc3QuUHJvYmUuRW50cmllcy5BdmUgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oRnhfd2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLkF2ZSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChGeF93YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuQXZlLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuUHJvYmUuRW50cmllcy5BdmUgPC0gcXBsb3Qoc2FtcGxlID0gRnhfd2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLkF2ZSkKcXFwbG90LlByb2JlLkVudHJpZXMuQXZlCmJveHBsb3QoRnhfd2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLkF2ZSwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkVudHJpZXMiKQpnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuRW50cmllcy5BdmUpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuRW50cmllcy5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LlByb2JlLlBlcmNlbnQxIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoUHJvYmUuUGVyY2VudDEpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJQZXJjZW50IiwgeSA9ICJOdW1iZXIiKQpoaXN0LlByb2JlLlBlcmNlbnQxICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEZ4X3dhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDEsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoRnhfd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MSwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LlByb2JlLlBlcmNlbnQxIDwtIHFwbG90KHNhbXBsZSA9IEZ4X3dhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDEpCnFxcGxvdC5Qcm9iZS5QZXJjZW50MQpib3hwbG90KEZ4X3dhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDEsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJQZXJjZW50IikKZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5QZXJjZW50MSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLlBlcmNlbnQxKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLlBlcmNlbnQxLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5Qcm9iZS5QZXJjZW50MiA8LSBnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKFByb2JlLlBlcmNlbnQyKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiUGVyY2VudCIsIHkgPSAiTnVtYmVyIikKaGlzdC5Qcm9iZS5QZXJjZW50MiArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihGeF93YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQyLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEZ4X3dhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDIsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Qcm9iZS5QZXJjZW50MiA8LSBxcGxvdChzYW1wbGUgPSBGeF93YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQyKQpxcXBsb3QuUHJvYmUuUGVyY2VudDIKYm94cGxvdChGeF93YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQyLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iUGVyY2VudCIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudDIsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5QZXJjZW50MikpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5QZXJjZW50MiwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuUHJvYmUuUGVyY2VudDMgPC0gZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyhQcm9iZS5QZXJjZW50MykpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIlBlcmNlbnQiLCB5ID0gIk51bWJlciIpCmhpc3QuUHJvYmUuUGVyY2VudDMgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oRnhfd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChGeF93YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQzLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuUHJvYmUuUGVyY2VudDMgPC0gcXBsb3Qoc2FtcGxlID0gRnhfd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MykKcXFwbG90LlByb2JlLlBlcmNlbnQzCmJveHBsb3QoRnhfd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MywgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IlBlcmNlbnQiKQpnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLlBlcmNlbnQzLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudDMpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudDMsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LlByb2JlLlBlcmNlbnQuQXZlIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoUHJvYmUuUGVyY2VudC5BdmUpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJQZXJjZW50IiwgeSA9ICJOdW1iZXIiKQpoaXN0LlByb2JlLlBlcmNlbnQuQXZlICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEZ4X3dhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudC5BdmUsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoRnhfd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50LkF2ZSwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LlByb2JlLlBlcmNlbnQuQXZlIDwtIHFwbG90KHNhbXBsZSA9IEZ4X3dhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudC5BdmUpCnFxcGxvdC5Qcm9iZS5QZXJjZW50LkF2ZQpib3hwbG90KEZ4X3dhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudC5BdmUsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJQZXJjZW50IikKZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5QZXJjZW50LkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLlBlcmNlbnQuQXZlKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLlBlcmNlbnQuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5Qcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCA8LSBnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKFByb2JlMi5PcHBvc2l0ZS5QZXJjZW50KSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiUGVyY2VudCIsIHkgPSAiTnVtYmVyIikKaGlzdC5Qcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihGeF93YXRlcm1hemVkYXRhJFByb2JlMi5PcHBvc2l0ZS5QZXJjZW50LCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEZ4X3dhdGVybWF6ZWRhdGEkUHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Qcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCA8LSBxcGxvdChzYW1wbGUgPSBGeF93YXRlcm1hemVkYXRhJFByb2JlMi5PcHBvc2l0ZS5QZXJjZW50KQpxcXBsb3QuUHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQKYm94cGxvdChGeF93YXRlcm1hemVkYXRhJFByb2JlMi5PcHBvc2l0ZS5QZXJjZW50LCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iUGVyY2VudCIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KEZ4X3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCiMgV29ya2luZyBtZW1vcnkgc3R1ZmYKCmhpc3QuV29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoV29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiRHVyYXRpb24iLCB5ID0gIk51bWJlciIpCmhpc3QuV29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEZ4X3dhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEZ4X3dhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuV29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlIDwtIHFwbG90KHNhbXBsZSA9IEZ4X3dhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlKQpxcXBsb3QuV29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlCmJveHBsb3QoRnhfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEdXJhdGlvbiIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9V29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9V29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRHVyYXRpb24uVHJpYWwxLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiRHVyYXRpb24iLCB5ID0gIk51bWJlciIpCmhpc3QuV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEZ4X3dhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEZ4X3dhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlIDwtIHFwbG90KHNhbXBsZSA9IEZ4X3dhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlKQpxcXBsb3QuV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlCmJveHBsb3QoRnhfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLlRyaWFsMi5BdmUsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEdXJhdGlvbiIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9V29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9V29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRHVyYXRpb24uVHJpYWwyLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSA8LSBnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKFdvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJEdXJhdGlvbiIsIHkgPSAiTnVtYmVyIikKaGlzdC5Xb3JraW5nLkR1cmF0aW9uLkRpZmYuQXZlICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEZ4X3dhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChGeF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Xb3JraW5nLkR1cmF0aW9uLkRpZmYuQXZlIDwtIHFwbG90KHNhbXBsZSA9IEZ4X3dhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSkKcXFwbG90LldvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUKYm94cGxvdChGeF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEdXJhdGlvbiIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9V29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9V29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuV29ya2luZy5EaXN0YW5jZS5UcmlhbDEuQXZlIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoV29ya2luZy5EaXN0YW5jZS5UcmlhbDEuQXZlKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiRGlzdGFuY2UiLCB5ID0gIk51bWJlciIpCmhpc3QuV29ya2luZy5EaXN0YW5jZS5UcmlhbDEuQXZlICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEZ4X3dhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5UcmlhbDEuQXZlLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEZ4X3dhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5UcmlhbDEuQXZlLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuV29ya2luZy5EaXN0YW5jZS5UcmlhbDEuQXZlIDwtIHFwbG90KHNhbXBsZSA9IEZ4X3dhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5UcmlhbDEuQXZlKQpxcXBsb3QuV29ya2luZy5EaXN0YW5jZS5UcmlhbDEuQXZlCmJveHBsb3QoRnhfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLlRyaWFsMS5BdmUsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEaXN0YW5jZSIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9V29ya2luZy5EaXN0YW5jZS5UcmlhbDEuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9V29ya2luZy5EaXN0YW5jZS5UcmlhbDEuQXZlKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuV29ya2luZy5EaXN0YW5jZS5UcmlhbDIuQXZlIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoV29ya2luZy5EaXN0YW5jZS5UcmlhbDIuQXZlKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiRGlzdGFuY2UiLCB5ID0gIk51bWJlciIpCmhpc3QuV29ya2luZy5EaXN0YW5jZS5UcmlhbDIuQXZlICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEZ4X3dhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5UcmlhbDIuQXZlLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKEZ4X3dhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5UcmlhbDIuQXZlLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuV29ya2luZy5EaXN0YW5jZS5UcmlhbDIuQXZlIDwtIHFwbG90KHNhbXBsZSA9IEZ4X3dhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5UcmlhbDIuQXZlKQpxcXBsb3QuV29ya2luZy5EaXN0YW5jZS5UcmlhbDIuQXZlCmJveHBsb3QoRnhfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEaXN0YW5jZSIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9V29ya2luZy5EaXN0YW5jZS5UcmlhbDIuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9V29ya2luZy5EaXN0YW5jZS5UcmlhbDIuQXZlKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuV29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSA8LSBnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKFdvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJEaXN0YW5jZSIsIHkgPSAiTnVtYmVyIikKaGlzdC5Xb3JraW5nLkRpc3RhbmNlLkRpZmYuQXZlICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKEZ4X3dhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChGeF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Xb3JraW5nLkRpc3RhbmNlLkRpZmYuQXZlIDwtIHFwbG90KHNhbXBsZSA9IEZ4X3dhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSkKcXFwbG90LldvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUKYm94cGxvdChGeF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEaXN0YW5jZSIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9V29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoRnhfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChGeF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9V29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCiMgU2gKIyBEdXJhdGlvbgoKaGlzdC5EdXJhdGlvbi5DdWVkIDwtIGdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoRHVyYXRpb24uQ3VlZCkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkF2ZXJhZ2UgQ3VlZCBEdXJhdGlvbiIsIHkgPSAiTnVtYmVyIikKaGlzdC5EdXJhdGlvbi5DdWVkICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKFNoX3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChTaF93YXRlcm1hemVkYXRhJER1cmF0aW9uLkN1ZWQsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5EdXJhdGlvbi5DdWVkIDwtIHFwbG90KHNhbXBsZSA9IFNoX3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uQ3VlZCkKcXFwbG90LkR1cmF0aW9uLkN1ZWQKYm94cGxvdChTaF93YXRlcm1hemVkYXRhJER1cmF0aW9uLkN1ZWQsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEdXJhdGlvbiIpCmdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uQ3VlZCwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLkN1ZWQpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uQ3VlZCwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCgpoaXN0LkR1cmF0aW9uLlNwYXRpYWwxIDwtIGdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoRHVyYXRpb24uU3BhdGlhbDEpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJBdmVyYWdlIFNwYXRpYWwgRHVyYXRpb24iLCB5ID0gIk51bWJlciIpCmhpc3QuRHVyYXRpb24uU3BhdGlhbDEgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oU2hfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChTaF93YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwxLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuRHVyYXRpb24uU3BhdGlhbDEgPC0gcXBsb3Qoc2FtcGxlID0gU2hfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMSkKcXFwbG90LkR1cmF0aW9uLlNwYXRpYWwxCmJveHBsb3QoU2hfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMSwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkR1cmF0aW9uIikKZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EdXJhdGlvbi5TcGF0aWFsMSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLlNwYXRpYWwxKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLlNwYXRpYWwxLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKCmhpc3QuRHVyYXRpb24uU3BhdGlhbDIgPC0gZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyhEdXJhdGlvbi5TcGF0aWFsMikpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkF2ZXJhZ2UgU3BhdGlhbCBEdXJhdGlvbiIsIHkgPSAiTnVtYmVyIikKaGlzdC5EdXJhdGlvbi5TcGF0aWFsMiArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihTaF93YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKFNoX3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbDIsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5EdXJhdGlvbi5TcGF0aWFsMiA8LSBxcGxvdChzYW1wbGUgPSBTaF93YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyKQpxcXBsb3QuRHVyYXRpb24uU3BhdGlhbDIKYm94cGxvdChTaF93YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwyLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRHVyYXRpb24iKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLlNwYXRpYWwyLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uU3BhdGlhbDIpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uU3BhdGlhbDIsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LkR1cmF0aW9uLlNwYXRpYWwzIDwtIGdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoRHVyYXRpb24uU3BhdGlhbDMpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJBdmVyYWdlIFNwYXRpYWwgRHVyYXRpb24iLCB5ID0gIk51bWJlciIpCmhpc3QuRHVyYXRpb24uU3BhdGlhbDMgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oU2hfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChTaF93YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwzLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuRHVyYXRpb24uU3BhdGlhbDMgPC0gcXBsb3Qoc2FtcGxlID0gU2hfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMykKcXFwbG90LkR1cmF0aW9uLlNwYXRpYWwzCmJveHBsb3QoU2hfd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsMywgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkR1cmF0aW9uIikKZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EdXJhdGlvbi5TcGF0aWFsMywgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLlNwYXRpYWwzKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLlNwYXRpYWwzLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5EdXJhdGlvbi5TcGF0aWFsIDwtIGdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoRHVyYXRpb24uU3BhdGlhbCkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkF2ZXJhZ2UgU3BhdGlhbCBEdXJhdGlvbiIsIHkgPSAiTnVtYmVyIikKaGlzdC5EdXJhdGlvbi5TcGF0aWFsICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKFNoX3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChTaF93YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5EdXJhdGlvbi5TcGF0aWFsIDwtIHFwbG90KHNhbXBsZSA9IFNoX3dhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbCkKcXFwbG90LkR1cmF0aW9uLlNwYXRpYWwKYm94cGxvdChTaF93YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEdXJhdGlvbiIpCmdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uU3BhdGlhbCwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLlNwYXRpYWwpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uU3BhdGlhbCwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCiMgRGlzdGFuY2UKCmhpc3QuRGlzdGFuY2UuQ3VlZCA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKERpc3RhbmNlLkN1ZWQpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJBdmVyYWdlIEN1ZWQgRGlzdGFuY2UiLCB5ID0gIk51bWJlciIpCmhpc3QuRGlzdGFuY2UuQ3VlZCArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihTaF93YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoU2hfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5DdWVkLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuRGlzdGFuY2UuQ3VlZCA8LSBxcGxvdChzYW1wbGUgPSBTaF93YXRlcm1hemVkYXRhJERpc3RhbmNlLkN1ZWQpCnFxcGxvdC5EaXN0YW5jZS5DdWVkCmJveHBsb3QoU2hfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5DdWVkLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRGlzdGFuY2UiKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLkN1ZWQsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EaXN0YW5jZS5DdWVkKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLkN1ZWQsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LkRpc3RhbmNlLlNwYXRpYWwxIDwtIGdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoRGlzdGFuY2UuU3BhdGlhbDEpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJBdmVyYWdlIFNwYXRpYWwgRGlzdGFuY2UiLCB5ID0gIk51bWJlciIpCmhpc3QuRGlzdGFuY2UuU3BhdGlhbDEgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oU2hfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChTaF93YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwxLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuRGlzdGFuY2UuU3BhdGlhbDEgPC0gcXBsb3Qoc2FtcGxlID0gU2hfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMSkKcXFwbG90LkRpc3RhbmNlLlNwYXRpYWwxCmJveHBsb3QoU2hfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMSwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkRpc3RhbmNlIikKZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EaXN0YW5jZS5TcGF0aWFsMSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLlNwYXRpYWwxKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLlNwYXRpYWwxLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5EaXN0YW5jZS5TcGF0aWFsMiA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKERpc3RhbmNlLlNwYXRpYWwyKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiQXZlcmFnZSBTcGF0aWFsIERpc3RhbmNlIiwgeSA9ICJOdW1iZXIiKQpoaXN0LkRpc3RhbmNlLlNwYXRpYWwyICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKFNoX3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoU2hfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsMiwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LkRpc3RhbmNlLlNwYXRpYWwyIDwtIHFwbG90KHNhbXBsZSA9IFNoX3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIpCnFxcGxvdC5EaXN0YW5jZS5TcGF0aWFsMgpib3hwbG90KFNoX3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDIsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJEaXN0YW5jZSIpCmdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuU3BhdGlhbDIsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EaXN0YW5jZS5TcGF0aWFsMikpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EaXN0YW5jZS5TcGF0aWFsMiwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuRGlzdGFuY2UuU3BhdGlhbDMgPC0gZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyhEaXN0YW5jZS5TcGF0aWFsMykpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkF2ZXJhZ2UgU3BhdGlhbCBEaXN0YW5jZSIsIHkgPSAiTnVtYmVyIikKaGlzdC5EaXN0YW5jZS5TcGF0aWFsMyArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihTaF93YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwzLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKFNoX3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbDMsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5EaXN0YW5jZS5TcGF0aWFsMyA8LSBxcGxvdChzYW1wbGUgPSBTaF93YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwzKQpxcXBsb3QuRGlzdGFuY2UuU3BhdGlhbDMKYm94cGxvdChTaF93YXRlcm1hemVkYXRhJERpc3RhbmNlLlNwYXRpYWwzLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRGlzdGFuY2UiKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLlNwYXRpYWwzLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuU3BhdGlhbDMpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuU3BhdGlhbDMsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LkRpc3RhbmNlLlNwYXRpYWwgPC0gZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyhEaXN0YW5jZS5TcGF0aWFsKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiQXZlcmFnZSBTcGF0aWFsIERpc3RhbmNlIiwgeSA9ICJOdW1iZXIiKQpoaXN0LkRpc3RhbmNlLlNwYXRpYWwgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oU2hfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKFNoX3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbCwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LkRpc3RhbmNlLlNwYXRpYWwgPC0gcXBsb3Qoc2FtcGxlID0gU2hfd2F0ZXJtYXplZGF0YSREaXN0YW5jZS5TcGF0aWFsKQpxcXBsb3QuRGlzdGFuY2UuU3BhdGlhbApib3hwbG90KFNoX3dhdGVybWF6ZWRhdGEkRGlzdGFuY2UuU3BhdGlhbCwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkRpc3RhbmNlIikKZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EaXN0YW5jZS5TcGF0aWFsLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuU3BhdGlhbCkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EaXN0YW5jZS5TcGF0aWFsLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKIyBTcGVlZAoKaGlzdC5TcGVlZCA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKFNwZWVkKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiQXZlcmFnZSBTcGVlZCIsIHkgPSAiTnVtYmVyIikKaGlzdC5TcGVlZCArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihTaF93YXRlcm1hemVkYXRhJFNwZWVkLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKFNoX3dhdGVybWF6ZWRhdGEkU3BlZWQsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5TcGVlZCA8LSBxcGxvdChzYW1wbGUgPSBTaF93YXRlcm1hemVkYXRhJFNwZWVkKQpxcXBsb3QuU3BlZWQKYm94cGxvdChTaF93YXRlcm1hemVkYXRhJFNwZWVkLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iU3BlZWQiKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVNwZWVkLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9U3BlZWQpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9U3BlZWQsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgoKIyBQcm9iZSBzdHVmZgoKaGlzdC5Qcm9iZS5FbnRyaWVzLjEgPC0gZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyhQcm9iZS5FbnRyaWVzLjEpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJBdmVyYWdlIEVudHJpZXMiLCB5ID0gIk51bWJlciIpCmhpc3QuUHJvYmUuRW50cmllcy4xICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKFNoX3dhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4xLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKFNoX3dhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4xLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuUHJvYmUuRW50cmllcy4xIDwtIHFwbG90KHNhbXBsZSA9IFNoX3dhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4xKQpxcXBsb3QuUHJvYmUuRW50cmllcy4xCmJveHBsb3QoU2hfd2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjEsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJFbnRyaWVzIikKZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5FbnRyaWVzLjEsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5FbnRyaWVzLjEpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuRW50cmllcy4xLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5Qcm9iZS5FbnRyaWVzLjIgPC0gZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyhQcm9iZS5FbnRyaWVzLjIpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJFbnRyaWVzIiwgeSA9ICJOdW1iZXIiKQpoaXN0LlByb2JlLkVudHJpZXMuMiArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihTaF93YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMiwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChTaF93YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMiwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LlByb2JlLkVudHJpZXMuMiA8LSBxcGxvdChzYW1wbGUgPSBTaF93YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMikKcXFwbG90LlByb2JlLkVudHJpZXMuMgpib3hwbG90KFNoX3dhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy4yLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRW50cmllcyIpCmdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuRW50cmllcy4yLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuRW50cmllcy4yKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuMiwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuUHJvYmUuRW50cmllcy4zIDwtIGdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoUHJvYmUuRW50cmllcy4zKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiRW50cmllcyIsIHkgPSAiTnVtYmVyIikKaGlzdC5Qcm9iZS5FbnRyaWVzLjMgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oU2hfd2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjMsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoU2hfd2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjMsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Qcm9iZS5FbnRyaWVzLjMgPC0gcXBsb3Qoc2FtcGxlID0gU2hfd2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLjMpCnFxcGxvdC5Qcm9iZS5FbnRyaWVzLjMKYm94cGxvdChTaF93YXRlcm1hemVkYXRhJFByb2JlLkVudHJpZXMuMywgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IkVudHJpZXMiKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuMywgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuMykpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5FbnRyaWVzLjMsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LlByb2JlLkVudHJpZXMuQXZlIDwtIGdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoUHJvYmUuRW50cmllcy5BdmUpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJFbnRyaWVzIiwgeSA9ICJOdW1iZXIiKQpoaXN0LlByb2JlLkVudHJpZXMuQXZlICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKFNoX3dhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy5BdmUsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoU2hfd2F0ZXJtYXplZGF0YSRQcm9iZS5FbnRyaWVzLkF2ZSwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LlByb2JlLkVudHJpZXMuQXZlIDwtIHFwbG90KHNhbXBsZSA9IFNoX3dhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy5BdmUpCnFxcGxvdC5Qcm9iZS5FbnRyaWVzLkF2ZQpib3hwbG90KFNoX3dhdGVybWF6ZWRhdGEkUHJvYmUuRW50cmllcy5BdmUsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJFbnRyaWVzIikKZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5FbnRyaWVzLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuQXZlKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5Qcm9iZS5QZXJjZW50MSA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKFByb2JlLlBlcmNlbnQxKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiUGVyY2VudCIsIHkgPSAiTnVtYmVyIikKaGlzdC5Qcm9iZS5QZXJjZW50MSArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihTaF93YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQxLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKFNoX3dhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDEsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Qcm9iZS5QZXJjZW50MSA8LSBxcGxvdChzYW1wbGUgPSBTaF93YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQxKQpxcXBsb3QuUHJvYmUuUGVyY2VudDEKYm94cGxvdChTaF93YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQxLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iUGVyY2VudCIpCmdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudDEsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5QZXJjZW50MSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5QZXJjZW50MSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuUHJvYmUuUGVyY2VudDIgPC0gZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyhQcm9iZS5QZXJjZW50MikpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIlBlcmNlbnQiLCB5ID0gIk51bWJlciIpCmhpc3QuUHJvYmUuUGVyY2VudDIgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oU2hfd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MiwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChTaF93YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQyLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuUHJvYmUuUGVyY2VudDIgPC0gcXBsb3Qoc2FtcGxlID0gU2hfd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MikKcXFwbG90LlByb2JlLlBlcmNlbnQyCmJveHBsb3QoU2hfd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MiwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IlBlcmNlbnQiKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLlBlcmNlbnQyLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudDIpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudDIsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LlByb2JlLlBlcmNlbnQzIDwtIGdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoUHJvYmUuUGVyY2VudDMpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKwogIGxhYnMoeCA9ICJQZXJjZW50IiwgeSA9ICJOdW1iZXIiKQpoaXN0LlByb2JlLlBlcmNlbnQzICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdAogICAgICAgICAgICAgICAgKG1lYW4gPSBtZWFuKFNoX3dhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDMsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoU2hfd2F0ZXJtYXplZGF0YSRQcm9iZS5QZXJjZW50MywgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LlByb2JlLlBlcmNlbnQzIDwtIHFwbG90KHNhbXBsZSA9IFNoX3dhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDMpCnFxcGxvdC5Qcm9iZS5QZXJjZW50Mwpib3hwbG90KFNoX3dhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudDMsIG1haW49IkJveHBsb3RzIGJ5IEdyb3VwIiwgeGxhYj0iR3JvdXAiLCB5bGFiPSJQZXJjZW50IikKZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5QZXJjZW50MywgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLlBlcmNlbnQzKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLlBlcmNlbnQzLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV92aW9saW4oKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42LCBvcHRpb249IkEiKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIlZpb2xpbiBjaGFydCIpICsKICB4bGFiKCIiKQoKaGlzdC5Qcm9iZS5QZXJjZW50LkF2ZSA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKFByb2JlLlBlcmNlbnQuQXZlKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiUGVyY2VudCIsIHkgPSAiTnVtYmVyIikKaGlzdC5Qcm9iZS5QZXJjZW50LkF2ZSArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihTaF93YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQuQXZlLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICBzZCA9IHNkKFNoX3dhdGVybWF6ZWRhdGEkUHJvYmUuUGVyY2VudC5BdmUsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpCnFxcGxvdC5Qcm9iZS5QZXJjZW50LkF2ZSA8LSBxcGxvdChzYW1wbGUgPSBTaF93YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQuQXZlKQpxcXBsb3QuUHJvYmUuUGVyY2VudC5BdmUKYm94cGxvdChTaF93YXRlcm1hemVkYXRhJFByb2JlLlBlcmNlbnQuQXZlLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iUGVyY2VudCIpCmdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudC5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5QZXJjZW50LkF2ZSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5QZXJjZW50LkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fdmlvbGluKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNiwgb3B0aW9uPSJBIikgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJWaW9saW4gY2hhcnQiKSArCiAgeGxhYigiIikKCmhpc3QuUHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQgPC0gZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyhQcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIlBlcmNlbnQiLCB5ID0gIk51bWJlciIpCmhpc3QuUHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0CiAgICAgICAgICAgICAgICAobWVhbiA9IG1lYW4oU2hfd2F0ZXJtYXplZGF0YSRQcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChTaF93YXRlcm1hemVkYXRhJFByb2JlMi5PcHBvc2l0ZS5QZXJjZW50LCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuUHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQgPC0gcXBsb3Qoc2FtcGxlID0gU2hfd2F0ZXJtYXplZGF0YSRQcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCkKcXFwbG90LlByb2JlMi5PcHBvc2l0ZS5QZXJjZW50CmJveHBsb3QoU2hfd2F0ZXJtYXplZGF0YSRQcm9iZTIuT3Bwb3NpdGUuUGVyY2VudCwgbWFpbj0iQm94cGxvdHMgYnkgR3JvdXAiLCB4bGFiPSJHcm91cCIsIHlsYWI9IlBlcmNlbnQiKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlMi5PcHBvc2l0ZS5QZXJjZW50LCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdChTaF93YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgojIFdvcmtpbmcgbWVtb3J5IHN0dWZmCgpoaXN0LldvcmtpbmcuRHVyYXRpb24uVHJpYWwxLkF2ZSA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKFdvcmtpbmcuRHVyYXRpb24uVHJpYWwxLkF2ZSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkR1cmF0aW9uIiwgeSA9ICJOdW1iZXIiKQpoaXN0LldvcmtpbmcuRHVyYXRpb24uVHJpYWwxLkF2ZSArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihTaF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uVHJpYWwxLkF2ZSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChTaF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uVHJpYWwxLkF2ZSwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LldvcmtpbmcuRHVyYXRpb24uVHJpYWwxLkF2ZSA8LSBxcGxvdChzYW1wbGUgPSBTaF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uVHJpYWwxLkF2ZSkKcXFwbG90LldvcmtpbmcuRHVyYXRpb24uVHJpYWwxLkF2ZQpib3hwbG90KFNoX3dhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDEuQXZlLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRHVyYXRpb24iKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRHVyYXRpb24uVHJpYWwxLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRHVyYXRpb24uVHJpYWwxLkF2ZSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LldvcmtpbmcuRHVyYXRpb24uVHJpYWwyLkF2ZSA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKFdvcmtpbmcuRHVyYXRpb24uVHJpYWwyLkF2ZSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkR1cmF0aW9uIiwgeSA9ICJOdW1iZXIiKQpoaXN0LldvcmtpbmcuRHVyYXRpb24uVHJpYWwyLkF2ZSArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihTaF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uVHJpYWwyLkF2ZSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChTaF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uVHJpYWwyLkF2ZSwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LldvcmtpbmcuRHVyYXRpb24uVHJpYWwyLkF2ZSA8LSBxcGxvdChzYW1wbGUgPSBTaF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uVHJpYWwyLkF2ZSkKcXFwbG90LldvcmtpbmcuRHVyYXRpb24uVHJpYWwyLkF2ZQpib3hwbG90KFNoX3dhdGVybWF6ZWRhdGEkV29ya2luZy5EdXJhdGlvbi5UcmlhbDIuQXZlLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRHVyYXRpb24iKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRHVyYXRpb24uVHJpYWwyLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRHVyYXRpb24uVHJpYWwyLkF2ZSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMi5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LldvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUgPC0gZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyhXb3JraW5nLkR1cmF0aW9uLkRpZmYuQXZlKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiRHVyYXRpb24iLCB5ID0gIk51bWJlciIpCmhpc3QuV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihTaF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoU2hfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLkRpZmYuQXZlLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuV29ya2luZy5EdXJhdGlvbi5EaWZmLkF2ZSA8LSBxcGxvdChzYW1wbGUgPSBTaF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUpCnFxcGxvdC5Xb3JraW5nLkR1cmF0aW9uLkRpZmYuQXZlCmJveHBsb3QoU2hfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkR1cmF0aW9uLkRpZmYuQXZlLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRHVyYXRpb24iKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkR1cmF0aW9uLkRpZmYuQXZlKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LldvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkRpc3RhbmNlIiwgeSA9ICJOdW1iZXIiKQpoaXN0LldvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihTaF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChTaF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LldvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSA8LSBxcGxvdChzYW1wbGUgPSBTaF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSkKcXFwbG90LldvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZQpib3hwbG90KFNoX3dhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5UcmlhbDEuQXZlLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRGlzdGFuY2UiKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMS5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LldvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiKSArCiAgbGFicyh4ID0gIkRpc3RhbmNlIiwgeSA9ICJOdW1iZXIiKQpoaXN0LldvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihTaF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgc2QgPSBzZChTaF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkKcXFwbG90LldvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSA8LSBxcGxvdChzYW1wbGUgPSBTaF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSkKcXFwbG90LldvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZQpib3hwbG90KFNoX3dhdGVybWF6ZWRhdGEkV29ya2luZy5EaXN0YW5jZS5UcmlhbDIuQXZlLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRGlzdGFuY2UiKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpoaXN0LldvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUgPC0gZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyhXb3JraW5nLkRpc3RhbmNlLkRpZmYuQXZlKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uKSwgY29sb3VyID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBsYWJzKHggPSAiRGlzdGFuY2UiLCB5ID0gIk51bWJlciIpCmhpc3QuV29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QKICAgICAgICAgICAgICAgIChtZWFuID0gbWVhbihTaF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgIHNkID0gc2QoU2hfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLkRpZmYuQXZlLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKQpxcXBsb3QuV29ya2luZy5EaXN0YW5jZS5EaWZmLkF2ZSA8LSBxcGxvdChzYW1wbGUgPSBTaF93YXRlcm1hemVkYXRhJFdvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUpCnFxcGxvdC5Xb3JraW5nLkRpc3RhbmNlLkRpZmYuQXZlCmJveHBsb3QoU2hfd2F0ZXJtYXplZGF0YSRXb3JraW5nLkRpc3RhbmNlLkRpZmYuQXZlLCBtYWluPSJCb3hwbG90cyBieSBHcm91cCIsIHhsYWI9Ikdyb3VwIiwgeWxhYj0iRGlzdGFuY2UiKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KFNoX3dhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkRpc3RhbmNlLkRpZmYuQXZlKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3QoU2hfd2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpgYGAKCk5vdyB2aXN1YWxseSBjb21wYXJlIGdyb3VwcyBhZ2FpbnN0IGVhY2ggb3RoZXIKCmBgYHtyfQojIEJyb2tlbiBkb3duIGJ5IGdyb3VwIGFsbCBvbiAxIGdyYXBoCgojIER1cmF0aW9uCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLkN1ZWQsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EdXJhdGlvbi5DdWVkKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLkN1ZWQsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLlNwYXRpYWwxLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uU3BhdGlhbDEpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uU3BhdGlhbDEsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLlNwYXRpYWwyLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uU3BhdGlhbDIpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uU3BhdGlhbDIsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLlNwYXRpYWwzLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uU3BhdGlhbDMpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RHVyYXRpb24uU3BhdGlhbDMsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLlNwYXRpYWwsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EdXJhdGlvbi5TcGF0aWFsKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PUR1cmF0aW9uLlNwYXRpYWwsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgojIERpc3RhbmNlCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLkN1ZWQsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EaXN0YW5jZS5DdWVkKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLkN1ZWQsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLlNwYXRpYWwxLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuU3BhdGlhbDEpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuU3BhdGlhbDEsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLlNwYXRpYWwyLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuU3BhdGlhbDIpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuU3BhdGlhbDIsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLlNwYXRpYWwzLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuU3BhdGlhbDMpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9RGlzdGFuY2UuU3BhdGlhbDMsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLlNwYXRpYWwsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1EaXN0YW5jZS5TcGF0aWFsKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PURpc3RhbmNlLlNwYXRpYWwsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgojIFNwZWVkCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVNwZWVkLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9U3BlZWQpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9U3BlZWQsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgojIFByb2JlIHN0dWZmCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuMSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuMSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5FbnRyaWVzLjEsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuMiwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuMikpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5FbnRyaWVzLjIsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuMywgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuMykpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Qcm9iZS5FbnRyaWVzLjMsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLkVudHJpZXMuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuRW50cmllcy5BdmUpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuRW50cmllcy5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLlBlcmNlbnQxLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudDEpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudDEsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLlBlcmNlbnQyLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudDIpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudDIsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLlBlcmNlbnQzLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudDMpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudDMsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlLlBlcmNlbnQuQXZlLCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudC5BdmUpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUuUGVyY2VudC5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVByb2JlMi5PcHBvc2l0ZS5QZXJjZW50LCBmaWxsPSJ3aGl0ZSIpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIGFscGhhPTAuNikgKwogIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC40LCBhbHBoYT0wLjkpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiQSBib3hwbG90IHdpdGggaml0dGVyIikgKwogIHhsYWIoIiIpCnNjdHRyIDwtIGdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQpKSArIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCnNjdHRyICsgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhPSJtZWFuX3NkbCIsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCBnZW9tPSJjcm9zc2JhciIsIHdpZHRoPTAuNSwgY29sb3I9InJlZCIpCmdncGxvdCh3YXRlcm1hemVkYXRhLCBhZXMoeD1UcmVhdG1lbnQsIHk9UHJvYmUyLk9wcG9zaXRlLlBlcmNlbnQsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgojIFdvcmtpbmcgbWVtb3J5IHN0dWZmCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRHVyYXRpb24uVHJpYWwxLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRHVyYXRpb24uVHJpYWwxLkF2ZSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMS5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRHVyYXRpb24uVHJpYWwyLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRHVyYXRpb24uVHJpYWwyLkF2ZSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkR1cmF0aW9uLlRyaWFsMi5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkR1cmF0aW9uLkRpZmYuQXZlKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRHVyYXRpb24uRGlmZi5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRGlzdGFuY2UuVHJpYWwxLkF2ZSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMS5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSwgZmlsbD0id2hpdGUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYpICsKICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuNCwgYWxwaGE9MC45KSArCiAgdGhlbWVfaXBzdW0oKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTExKQogICkgKwogIGdndGl0bGUoIkEgYm94cGxvdCB3aXRoIGppdHRlciIpICsKICB4bGFiKCIiKQpzY3R0ciA8LSBnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRGlzdGFuY2UuVHJpYWwyLkF2ZSkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKc2N0dHIgKyBzdGF0X3N1bW1hcnkoZnVuLmRhdGE9Im1lYW5fc2RsIiwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIGdlb209ImNyb3NzYmFyIiwgd2lkdGg9MC41LCBjb2xvcj0icmVkIikKZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkRpc3RhbmNlLlRyaWFsMi5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCgpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgYWxwaGE9MC42KSArCiAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjQsIGFscGhhPTAuOSkgKwogIHRoZW1lX2lwc3VtKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSkKICApICsKICBnZ3RpdGxlKCJBIGJveHBsb3Qgd2l0aCBqaXR0ZXIiKSArCiAgeGxhYigiIikKc2N0dHIgPC0gZ2dwbG90KHdhdGVybWF6ZWRhdGEsIGFlcyh4PVRyZWF0bWVudCwgeT1Xb3JraW5nLkRpc3RhbmNlLkRpZmYuQXZlKSkgKyBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpzY3R0ciArIHN0YXRfc3VtbWFyeShmdW4uZGF0YT0ibWVhbl9zZGwiLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgZ2VvbT0iY3Jvc3NiYXIiLCB3aWR0aD0wLjUsIGNvbG9yPSJyZWQiKQpnZ3Bsb3Qod2F0ZXJtYXplZGF0YSwgYWVzKHg9VHJlYXRtZW50LCB5PVdvcmtpbmcuRGlzdGFuY2UuRGlmZi5BdmUsIGZpbGw9IndoaXRlIikpICsKICBnZW9tX3Zpb2xpbigpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBhbHBoYT0wLjYsIG9wdGlvbj0iQSIpICsKICB0aGVtZV9pcHN1bSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTEpCiAgKSArCiAgZ2d0aXRsZSgiVmlvbGluIGNoYXJ0IikgKwogIHhsYWIoIiIpCmBgYAoKCk1lZXRpbmcgYXNzdW1wdGlvbnMgb2Ygbm9ybWFsaXR5IC8gaG9tb2dlbmVpdHkgb2YgdmFyaWFuY2UgY2FuIGJlIHRvdWdoIHcvIGxhcmdlIGRhdGEgc2V0cyBiZWNhdXNlIHNtYWxsIHZhcmlhdGlvbnMgY2FuIGJlICJzaWduaWZpY2FudCIgKHlvdSBjYW4gYWxzbyB0ZXN0IGhvbW9nZW5laXR5IG9mIHZhcmlhbmNlIHcvICJ2YXJpYW5jZSByYXRpbyIgb3IgSGFydGxleSdzIEZtYXgpLiBFaXRoZXIgd2F5LCBpZiBkYXRhIGFyZSBub3Qgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgYW5kIG9mIGVxdWFsIHZhcmlhbmNlcywgcGFyYW1ldHJpYyB0ZXN0cyBhcmUgbm90IHZhbGlkLiBUbyBjb3JyZWN0ICJwcm9ibGVtcyIgd2l0aCB0aGUgZGF0YToKCk91dGxpZXJzCi0gcmVtb3ZlIHRoZSBjYXNlIC8gc3ViamVjdCAoZXNwZWNpYWxseSBpZiBpdCB3YXMgc29tZWhvdyAiZGlmZmVyZW50IikKLSAiYnJpbmcgdGhlIGNhc2UgaXQgaW50byB0aGUgZm9sZCIgdXNpbmcgdGhlIG1lYW4gKyAyIG9yIDMgU0RzIC0gQ2hhbmdlIHRoZSBzY29yZSB0byBiZSB0aGUgbWVhbiArIDIgb3IgMyBTRHMKLSAiYnJpbmcgdGhlIGNhc2UgaW50byB0aGUgZm9sZCIgdXNpbmcgdGhlIG5leHQgaGlnaGVzdCBzY29yZSBwbHVzIG9uZSBtZXRob2QgLSBDaGFuZ2UgdGhlIHNjb3JlIHRvIGJlIG9uZSB1bml0IGFib3ZlIHRoZSBuZXh0IGhpZ2hlc3Qgc2NvcmUgaW4gdGhlIGRhdGEgc2V0CgpGb3Igbm9uLW5vcm1hbGx5LWRpc3RyaWJ1dGVkIGRhdGE6Ci0gQ2FuIGFsc28gdXNlICJ0cmltbWVkIG1lYW5zIiAocmVtb3ZpbmcgYSBzcGVjaWZpYyAlIG9mIGNhc2VzIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gZWFjaCBlbmQpCi0gQ2FuIGFsc28gdXNlICJNLWVzdGltYXRvciIgd2hpY2ggZW1waXJpY2FsbHkgZGVyaXZlcyB0aGUgcHJvcGVyICUgdG8gdHJpbQotIENhbiBhbHNvIHVzZSBib290c3RyYXBwaW5nIHRvIGVzdGltYXRlICJ0cnVlIiBtZWFuIC8gdmFyaWFuY2UKLSBUcmFuc2Zvcm0gdGhlIGRhdGE6IGxvZywgc3F1YXJlIHJvb3QsIG9yIHJlY2lwcm9jYWwgdHJhbnNmb3JtYXRpb25zIGNhbiBjb3JyZWN0IGZvciBwb3NpdGl2ZSBza2V3IGFuZC9vciB1bmVxdWFsIHZhcmlhbmNlLiBJZiBkYXRhIGFyZSBuZWdhdGl2ZWx5IHNrZXdlZCwgeW91IG5lZWQgZGVyaXZlIGEgcmVjaXByb2NhbCBzY29yZSAocmV2ZXJzZSB0aGUgc2NvcmVzIGJ5IHN1YnRyYWN0aW5nIGVhY2ggc2NvcmUgZnJvbSB0aGUgaGlnaGVzdCBzY29yZSBvYnRhaW5lZCkKLS0gTWFrZSBuZXcgdHJhbnNmb3JtZWQgRFZzIHVzaW5nIG5ld1ZhcmlhYmxlIDwtIGZ1bmN0aW9uKG9sZFZhcmlhYmxlKQotLS0gU3F1YXJlIHJvb3Q6IHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbC5TcXJ0IDwtIHNxcnQod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsKQotLS0gQWJzb2x1dGUgdmFsdWU6IHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbC5BYnMgPC0gYWJzKHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbC5EaWZmKQotLS0gTG9nIChuYXR1cmFsKTogd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsLkxvZyA8LSBsb2cod2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsICsxKQorMSBuZWVkZWQgdG8gYXZvaWQgdHJ5aW5nIHRvIGNhbGN1bGF0ZSBsb2cgb2YgMAotLS0gTG9nIChiYXNlIDEwKTogd2F0ZXJtYXplZGF0YSREdXJhdGlvbi5TcGF0aWFsLkxvZzEwIDwtIGxvZzEwKHdhdGVybWF6ZWRhdGEkRHVyYXRpb24uU3BhdGlhbCkKKzEgbmVlZGVkIGZvciBiYXNlIDEwPz8/Ci0tLSBSZWNpcHJvY2FsOiB3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwuUmVjaXByb2NhbCA8LSAxLyh3YXRlcm1hemVkYXRhJER1cmF0aW9uLlNwYXRpYWwgKzEpICArMSBuZWVkZWQgdG8gYXZvaWQgdHJ5aW5nIHRvIGRpdmlkZSBieSB6ZXJv